如何解析/ proc / pid / cmdline

时间:2009-10-18 20:46:54

标签: linux

我正在尝试在Linux上拆分进程的cm​​dline,但似乎我不能依赖它来用'\ 0'字符分隔。你知道为什么有时'\ 0'字符用作分隔符,有时它是一个常规空格?

您是否知道检索可执行文件名称及其路径的其他方法?我一直试图用'ps'来获取这些信息,但它总是返回完整的命令行,并且可执行文件名被截断。

感谢。

8 个答案:

答案 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)

看看我的回答here。它涵盖了我在尝试自己时所发现的内容。

编辑:看看debian-user上的this线程,找到一个尽力做你想做的bash脚本(在该线程中查找脚本的第3版)。

答案 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