当进程名称包含空格时,我可以使用标准工具获取进程的全名吗?

Pet*_*r.O 6 bash process filename

我知道可执行文件中有空格可能是一种罕见的情况,但它可能会发生。

一个例子可能是最好的解释..

使用标准工具,我想确定拥有(?)当前窗口的可执行文件的位置(在文件系统上)...

  1. 获取当前窗口 ID ...( xdotoolgetactivewindow )
  2. 使用 ID 获取 PID ...( wmctrl-p -l | sed ... ID ....
  3. 使用 PID 来获取可执行文件的名称......(ps-A ...这里是我遇到问题的地方!

Whith ps,当仅列出可执行文件的名称 ( -o ucmd) 时,它会将名称截断为 15 个字符,因此对于任何更长的名称,这排除了此选项。
加宽列 ( -o ucmd:99) 没有任何区别.. 如果pgrep有任何事情要做,它的匹配限制为 15,因为stat(请参阅:info pgrep)。

-A w w当相关名称中包含空格时,“完整”模式(例如)的变体中的列表没有用,因为此名称与其参数被另一个空格分隔!...此外,在“完整”模式下,如果进程已启动通过链接,显示链接的名称,而不是可执行文件的名称。

有没有办法做到这一点(使用标准工具)?......或者空间是这里的表演障碍吗?

Gil*_*il' 7

所有实用程序都从/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,只有运行该进程的用户才有读取链接目标的权限。
  • 进程的第零个参数,由调用它的 shell 或其他程序选择。按照惯例,shell 会在您键入时选择可执行文件的名称(带或不带完整路径)。您可以从pswith ps -o cmd(或其同义词ps -o command)获取所有参数,但参数用空格分隔,因此您无法可靠地判断第零个参数在哪里停止。您可以从 中读取参数/proc/cmdline,它们由空字符分隔:</proc/$PID/cmdline awk -vRS='\0' '{print; exit;}'提取第零个参数。

为了完整起见,让我提一下,这些名称可以在进程的生命周期内更改,尽管大多数程序不会这样做:

  • 该过程可以改变Name的领域/proc/$PID/status,通过调用prctlPR_SET_NAME参数。
  • 可执行文件可以重命名或删除。在简单的情况下,Linux 会跟踪新名称(但边缘情况可能不起作用,例如,如果您对可执行文件进行硬链接)。如果文件被删除,内核会添加(deleted)到链接目标。
  • 进程的第零个参数是从进程内存中读取的(argv[0]在 C 中)。进程可以自由修改它。