如何获取 Linux 中正在运行的进程的完整可执行文件名称

如何获取 Linux 中正在运行的进程的完整可执行文件名称

我正在编写一个脚本,它将使用正在运行的进程的文件名。但是,我无法确定满的某些进程的可执行文件名称。

最初,我决定查询Name中的条目/proc/PID/status(或 中的第二个字段/proc/PID/stat)。然而,根据联机帮助页,该字段始终被截断为 15 个字符,但我需要全名以避免冲突/混淆。

的一个答案这个问题建议使用/proc/PID/cmdline,但也存在问题。一些程序(例如铬,电子)对其中的值做了愚蠢/聪明的事情,/proc/PID/cmdline所以我不能只是分割那里的数据NULL并直接获取联机帮助页中建议的程序名称 - 它们在原始内容中填写了很多东西argv[0] 字段并用空格分隔它们,我认为仅仅用空格分割不是一个好的选择,因为路径/文件名可能包含空格。

当我发现有些脚本(例如 python 脚本)在 form 中,/usr/bin/python /path/to/script而有些脚本在 form 中时,这就更加复杂了/path/to/script。不过,只要我有该字段(没有如上所述的堵塞)并手动检查和拆分,处理起来就容易得多。

有什么想法如何获取完整的程序名称/文件名吗?名称是否包含完整路径并不重要,因为这很容易处理(据我现在所见)。

答案1

/proc/$PID/exe似乎就是您要找的:(proc(5)

/proc/[pid]/exe
在 Linux 2.2 及更高版本中,该文件是一个符号链接,包含所执行命令的实际路径名。该符号链接可以正常取消引用;尝试打开它将打开可执行文件。

所以,简单地说:

$ /bin/cat & readlink /proc/$!/exe
/bin/cat

它实际上遵循可执行文件的重命名:

/tmp$ cp /bin/cat . ; ./cat & mv cat dog ; readlink /proc/$!/exe
/tmp/dog

答案2

在具有 procfs-2 支持标准的平台上procfs,您可以通过以下方式获得结果:

ls -l /proc/<pid>/path/a.out

文件 a.out 是二进制文件绝对路径的符号链接。

请注意,该问题没有提及 Linux,因此,提供有关此功能如何在procfsprocfs 发明者 Roger Faulkner 的原始实现上工作的信息是有意义的。

相关内容