我试图在 Linux 上分离进程的 cmdline,但似乎无法依赖它以 '\0' 字符分隔。您知道为什么有时会使用 '\0' 字符作为分隔符,而有时则是普通空格吗?
您知道检索可执行文件名称和路径的其他方法吗?我一直在尝试用 'ps' 获取此信息,但它总是返回完整的命令行,可执行文件名称被截断。
谢谢。
我试图在 Linux 上分离进程的 cmdline,但似乎无法依赖它以 '\0' 字符分隔。您知道为什么有时会使用 '\0' 字符作为分隔符,而有时则是普通空格吗?
您知道检索可执行文件名称和路径的其他方法吗?我一直在尝试用 'ps' 获取此信息,但它总是返回完整的命令行,可执行文件名称被截断。
谢谢。
使用 strings
$ cat /proc/self/cmdline | strings -1
cat
/proc/self/cmdline
/proc/PID/cmdline
始终由 NUL 字符分隔。
要了解空格,请执行此命令:
cat -v /proc/self/cmdline "a b" "c d e"
编辑:如果你真的看到了不该有的空格,或许你的可执行文件(有意或无意地)写入了 argv[]
,或者正在使用 setproctitle()
?
当进程由内核启动时,cmdline
是以 NUL 分隔的,而内核代码只是简单地复制在进程启动时 argv[]
存储的内存范围到输出缓冲区,当你读取 /proc/PID/cmdline
时。
使用
tr "\0" " " /proc/2634/cmdline
tr "\0" "\n"
,这对于复杂命令行的可读性有时非常有用。 - Per Lundberg/proc/PID/cmdline
中的命令行参数是用空字节分隔的。您可以使用 tr
命令将它们替换为新行:
tr '\0' '\n' < /proc/"$PID"/cmdline
\0
是用來分隔詞語的,而空格是在一個詞語中分隔單詞的嗎?例如,myprog "foo bar" baz
可能会出现在/proc/pid/cmdline
中...
/usr/bin/myprog\0foo bar\0baz
我完全是猜测,似乎在我的一台Linux机器上找不到任何空间。
超级简单的方法(但仅适用于一个进程,而不是批量解析等):
$ cat /proc/self/cmdline "a b" "cd e" | xargs -0
工作原理:默认情况下,xargs
只会将其输入进行 echo
操作,而 -0
开关则允许其读取以 null 分隔的行,而非以换行符分隔的行。
可执行文件名称:
cat /proc/${pid}/comm
可执行文件路径:
readlink -f /proc/${pid}/exe
mapfile -d '' -t command_line < "/proc/${pid}/cmdline"
busybox
用户:cat /proc/self/cmdline | strings -n 1
- dubbalugastrings
命令,而几乎没有Docker基础镜像带有该命令。所以,结果可能因人而异。 - undefined