linux 如何解析/proc/pid/pid行

hfwmuf9z  于 2023-10-16  发布在  Linux
关注(0)|答案(8)|浏览(154)

我试图在Linux上分割进程的行,但似乎我不能依靠它来用“\0”字符分隔。你知道为什么有时候“\0”字符被用作分隔符,有时候它是一个常规的空格吗?
你知道其他检索可执行文件名和路径的方法吗?我一直试图用“ps”获取此信息,但它总是返回完整的命令行,可执行文件名被截断。
谢谢.

6vl6ewon

6vl6ewon1#

使用strings

$ cat /proc/self/cmdline | strings -1
cat
/proc/self/cmdline
7gcisfzg

7gcisfzg2#

/proc/PID/cmdline * 始终 * 由NUL字符分隔。
要理解空格,请执行以下命令:

cat -v /proc/self/cmdline "a b" "c d e"

编辑:如果你真的看到了不应该有空格的地方,也许你的可执行文件(有意或无意)写入了argv[],或者正在使用setproctitle()
当进程由内核启动时,/proc/PID/cmdline行是用NULL分隔的,内核代码只是在读取/proc/PID/cmdline时将进程启动时argv[]所在的内存范围复制到输出缓冲区。

vvppvyoh

vvppvyoh3#

使用

tr "\0" " " /proc/2634/cmdline

以获得用空格分隔的args,就像您在命令行中看到的那样。
但是要注意的是,这样打印是没有办法区分一个带有空格的参数(“a b”)和两个独立的参数(“a”“b”)的。

ddhy6vgd

ddhy6vgd4#

/proc/PID/cmdline中的命令行参数由空字节分隔。您可以使用tr将它们替换为新行:

tr '\0' '\n' < /proc/"$PID"/cmdline
8e2ybdfx

8e2ybdfx5#

这是在黑暗中拍摄的,但有没有可能\0是分隔术语和空格是分隔一个术语中的单词?比如说,

myprog "foo bar" baz

可能会出现在/proc/pid/cmdline中作为...

/usr/bin/myprog\0foo bar\0baz

完全猜在这里,我似乎找不到任何空间对我的Linux盒之一。

wfsdck30

wfsdck306#

看看我的答案在这里。它涵盖了我自己尝试做这件事时发现的东西。
编辑:查看debian-user上的this线程,以获取一个bash脚本,该脚本会尽最大努力完成您想要的任务(在该线程中查找该脚本的第3版)。

bpzcxfmw

bpzcxfmw7#

超级简单(但只用于一个进程,而不是批量解析等):

$ cat /proc/self/cmdline "a b" "cd e" | xargs -0

工作原理:默认情况下,xargs只是echo 'es它的输入,而开关-0允许它读取空分隔行而不是换行符分隔行。

yizd12fk

yizd12fk8#

可执行文件名称:

cat /proc/${pid}/comm

可执行路径:

readlink -f /proc/${pid}/exe

如果你最近有一个bash,你可以使用mapfile将命令行拆分成参数,并将它们放在一个数组“command_line”中,如下所示:

mapfile -d '' -t command_line < "/proc/${pid}/cmdline"

关于/proc/的更多信息:proc(5) — Linux manual page

相关问题