如何解析/ proc/pid/cmdline

ryo*_*uki 15 linux

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

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

谢谢.

riy*_*ywo 20

使用 strings

$ cat /proc/self/cmdline | strings -1
cat
/proc/self/cmdline
Run Code Online (Sandbox Code Playgroud)


Emp*_*ian 14

/proc/PID/cmdline始终通过NULL字符分隔.

要了解空格,请执行以下命令:

cat -v /proc/self/cmdline "a b" "c d e"
Run Code Online (Sandbox Code Playgroud)

编辑:如果你真的看到不应该有的空间,也许你的可执行文件(有意或无意)写入argv[]或正在使用setproctitle()

当内核启动进程时,cmdline是NUL分隔的,内核代码只是argv[]在读取时将进程启动时的内存范围复制到输出缓冲区中/proc/PID/cmdline.


小智 10

使用

cat /proc/2634/cmdline | tr "\0" " "
Run Code Online (Sandbox Code Playgroud)

用空格分隔args,就像在命令行中看到的一样.

  • 当单独使用“tr”时无需使用“cat+tr”,请参阅@hek2mgl 答案。 (3认同)

hek*_*mgl 6

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

tr '\0' '\n' < /proc/"$PID"/cmdline
Run Code Online (Sandbox Code Playgroud)

  • 供应商盒子并不总是有“字符串”,它们通常有“tr”。 (2认同)

Jed*_*ith 4

这是一个盲目的尝试,但是\0分隔术语和空格是否有可能分隔术语内的单词?例如,

myprog "foo bar" baz
Run Code Online (Sandbox Code Playgroud)

可能出现在/proc/pid/cmdline...

/usr/bin/myprog\0foo bar\0baz
Run Code Online (Sandbox Code Playgroud)

完全猜测,我似乎在我的 Linux 机器上找不到任何空间。