我正在编写一个脚本,它将使用正在运行的进程的文件名。但是,我无法确定满的某些进程的可执行文件名称。
最初,我决定查询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,因此,提供有关此功能如何在procfs
procfs 发明者 Roger Faulkner 的原始实现上工作的信息是有意义的。