我了解可执行文件中包含空格的情况可能很少见,但它可能会发生。
一个例子可能是最好的解释..
使用标准工具,我想确定拥有(?)当前窗口的可执行文件的位置(在文件系统上)......
- 获取当前窗口 ID ...(
xdotool
getactivewindow ) - 使用 ID 获取 PID ...(
wmctrl
-p -l | sed ... ID .... - 使用 PID 获取可执行文件的名称 ...(
ps
-A ...这是我遇到问题的地方!
Whith ps
,当仅列出可执行文件的名称 ( -o ucmd
) 时,它会将名称截断为 15 个字符,因此对于任何更长的名称都排除了此选项。
加宽列 ( -o ucmd:99
) 没有任何区别。如果pgrep
有什么可以通过的,它的匹配限制为 15,因为stat
(参见:info pgrep)..
当相关名称中包含空格时,“完整”模式变体(例如-A w w
)中的列表没有用,因为该名称与它的 args 被另一个空格分隔!.. 此外,在“完整”模式下,如果进程已启动通过链接,将显示链接的名称,而不是可执行文件的名称。
有没有办法做到这一点(使用标准工具)?...或者空间是这里的表演者吗?
无论如何,所有实用程序都从中获取信息
/proc/$PID
,但是(至少)三个地方/proc/$PID
包含某种形式的可执行文件的名称,并且它们报告不同的信息。Name
字段/proc/$PID/status
(在 中也以更难解析的形式提供/proc/$PID/stat
)。这是可执行文件的名称,但被截断为 15 个字符。由于内核执行截断,因此没有任何选项ps
可以提供帮助。这就是ps -o comm
(或其同义词ps -o ucmd
)显示的内容。/proc/$PID/exename
指向可执行文件。您可以使用readlink /proc/$PID/exename
. 与上报的信息不同的是ps
,只有运行该进程的用户才具有读取链接目标的权限。ps
withps -o cmd
(或其同义词ps -o command
)获取所有参数,但参数由空格分隔,因此您无法可靠地判断第零个参数停止的位置。您可以从 中读取参数/proc/cmdline
,它们由空字符分隔:</proc/$PID/cmdline awk -vRS='\0' '{print; exit;}'
提取第零个参数。为了完整起见,让我提一下这些名称可以在进程的生命周期内更改,尽管大多数程序不会这样做:
Name
字段。/proc/$PID/status
prctl
PR_SET_NAME
(deleted)
到链接目标。argv[0]
在 C 中)。进程可以自由修改。其中 $PID 是您拥有的 PID。您想要的完整命令(基于您上面的问题)可能是: