我正在尝试在Linux上拆分进程的cmdline,但似乎我不能依赖它来用'\ 0'字符分隔。你知道为什么有时'\ 0'字符用作分隔符,有时它是一个常规空格?
您是否知道检索可执行文件名称及其路径的其他方法?我一直试图用'ps'来获取这些信息,但它总是返回完整的命令行,并且可执行文件名被截断。
感谢。
答案 0 :(得分:17)
使用strings
$ cat /proc/self/cmdline | strings -1
cat
/proc/self/cmdline
答案 1 :(得分:14)
/proc/PID/cmdline
总是以NUL字符分隔。
要理解空格,请执行以下命令:
cat -v /proc/self/cmdline "a b" "c d e"
编辑:如果你真的看到不应该有的空格,也许你的可执行文件(有意或无意)写入argv[]
,或者正在使用setproctitle()
?
当内核启动进程时,cmdline是NUL分隔的,kernel code simply copies当你读argv[]
时/proc/PID/cmdline
处于启动状态的内存范围进入输出缓冲区}。
答案 2 :(得分:8)
使用
cat /proc/2634/cmdline | tr "\0" " "
用空格分隔args,就像你在命令行上看到的一样。
答案 3 :(得分:4)
在黑暗中拍摄,但是\0
是否可能将术语和空格分隔开来是在一个术语中分隔单词?例如,
myprog "foo bar" baz
可能会在/proc/pid/cmdline
中显示为......
/usr/bin/myprog\0foo bar\0baz
在这里完全猜测,我似乎无法在我的一个Linux机箱上找到任何空格。
答案 4 :(得分:4)
/proc/PID/cmdline
中的命令行参数由空字节分隔。您可以使用tr
替换新行:
tr '\0' '\n' < /proc/"$PID"/cmdline
答案 5 :(得分:2)
答案 6 :(得分:0)
超级简单(但仅用于一个进程,而不是批量解析等):
$ cat /proc/self/cmdline "a b" "cd e" | xargs -0
它的工作方式:默认情况下,xargs
仅是其输入的echo
,而开关-0
则允许它读取以空分隔的行而不是以换行分隔的行。>
答案 7 :(得分:0)
可执行文件名称:
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