我试图在Linux上分割进程的行,但似乎我不能依靠它来用“\0”字符分隔。你知道为什么有时候“\0”字符被用作分隔符,有时候它是一个常规的空格吗?你知道其他检索可执行文件名和路径的方法吗?我一直试图用“ps”获取此信息,但它总是返回完整的命令行,可执行文件名被截断。谢谢.
6vl6ewon1#
使用strings
strings
$ cat /proc/self/cmdline | strings -1 cat /proc/self/cmdline
7gcisfzg2#
/proc/PID/cmdline * 始终 * 由NUL字符分隔。要理解空格,请执行以下命令:
/proc/PID/cmdline
cat -v /proc/self/cmdline "a b" "c d e"
编辑:如果你真的看到了不应该有空格的地方,也许你的可执行文件(有意或无意)写入了argv[],或者正在使用setproctitle()?当进程由内核启动时,/proc/PID/cmdline行是用NULL分隔的,内核代码只是在读取/proc/PID/cmdline时将进程启动时argv[]所在的内存范围复制到输出缓冲区。
argv[]
setproctitle()
vvppvyoh3#
使用
tr "\0" " " /proc/2634/cmdline
以获得用空格分隔的args,就像您在命令行中看到的那样。但是要注意的是,这样打印是没有办法区分一个带有空格的参数(“a b”)和两个独立的参数(“a”“b”)的。
ddhy6vgd4#
/proc/PID/cmdline中的命令行参数由空字节分隔。您可以使用tr将它们替换为新行:
tr
tr '\0' '\n' < /proc/"$PID"/cmdline
8e2ybdfx5#
这是在黑暗中拍摄的,但有没有可能\0是分隔术语和空格是分隔一个术语中的单词?比如说,
\0
myprog "foo bar" baz
可能会出现在/proc/pid/cmdline中作为...
/proc/pid/cmdline
/usr/bin/myprog\0foo bar\0baz
完全猜在这里,我似乎找不到任何空间对我的Linux盒之一。
wfsdck306#
看看我的答案在这里。它涵盖了我自己尝试做这件事时发现的东西。编辑:查看debian-user上的this线程,以获取一个bash脚本,该脚本会尽最大努力完成您想要的任务(在该线程中查找该脚本的第3版)。
bpzcxfmw7#
超级简单(但只用于一个进程,而不是批量解析等):
$ cat /proc/self/cmdline "a b" "cd e" | xargs -0
工作原理:默认情况下,xargs只是echo 'es它的输入,而开关-0允许它读取空分隔行而不是换行符分隔行。
xargs
echo
-0
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
8条答案
按热度按时间6vl6ewon1#
使用
strings
7gcisfzg2#
/proc/PID/cmdline
* 始终 * 由NUL字符分隔。要理解空格,请执行以下命令:
编辑:如果你真的看到了不应该有空格的地方,也许你的可执行文件(有意或无意)写入了
argv[]
,或者正在使用setproctitle()
?当进程由内核启动时,
/proc/PID/cmdline
行是用NULL分隔的,内核代码只是在读取/proc/PID/cmdline
时将进程启动时argv[]
所在的内存范围复制到输出缓冲区。vvppvyoh3#
使用
以获得用空格分隔的args,就像您在命令行中看到的那样。
但是要注意的是,这样打印是没有办法区分一个带有空格的参数(“a b”)和两个独立的参数(“a”“b”)的。
ddhy6vgd4#
/proc/PID/cmdline
中的命令行参数由空字节分隔。您可以使用tr
将它们替换为新行:8e2ybdfx5#
这是在黑暗中拍摄的,但有没有可能
\0
是分隔术语和空格是分隔一个术语中的单词?比如说,可能会出现在
/proc/pid/cmdline
中作为...完全猜在这里,我似乎找不到任何空间对我的Linux盒之一。
wfsdck306#
看看我的答案在这里。它涵盖了我自己尝试做这件事时发现的东西。
编辑:查看debian-user上的this线程,以获取一个bash脚本,该脚本会尽最大努力完成您想要的任务(在该线程中查找该脚本的第3版)。
bpzcxfmw7#
超级简单(但只用于一个进程,而不是批量解析等):
工作原理:默认情况下,
xargs
只是echo
'es它的输入,而开关-0
允许它读取空分隔行而不是换行符分隔行。yizd12fk8#
可执行文件名称:
可执行路径:
如果你最近有一个bash,你可以使用mapfile将命令行拆分成参数,并将它们放在一个数组“command_line”中,如下所示:
关于/proc/的更多信息:proc(5) — Linux manual page