知道该程序的PID,我想列出正在运行的程序的可执行文件。
对于二进制程序,我可以读取/proc/$pid/exe
,它是可执行文件的符号链接。
但是,对于脚本程序(例如 Python 程序),/proc/$pid/exe
指向/usr/bin/python
,而不是程序本身。无论我使用./program.py
还是使用启动程序,都会发生这种情况python program.py
。
我尝试了几种方法来解决:
/proc/$pid/cmdline
包含脚本的文件名,但它位于相对路径中,并且工作目录可能已经更改。
我也尝试过,/proc/$pid/comm
但它可以通过程序轻松更改。
那么如何知道一个正在运行的程序的原始脚本文件呢?
答案1
我们是否可以假设磁盘上的文件没有更改(至少没有添加或删除同名的文件)并且/proc/[pid]/cmdline
是可靠的(请参阅下面的旁注)?
根据过程(5):/proc/[pid]/environ
包含初始环境变量(即使程序本身改变了里面的环境变量,也不会改变),包括PWD
和PATH
。
因此:
如果 in 中的路径cmdline
以相对目录名开头,则可以使用PWD
(in /proc/[pid]/environ
) 作为基本路径并解析相对路径;
如果 in 中的路径cmdline
是程序本身的名称,则可以循环PATH
(in /proc/[pid]/environ
) 中的每个目录,目标是第一的具有相同名称的文件。
旁注:
/proc/[pid]/exe
似乎是取消引用的文件(例如,/usr/bin/python3.6
代替/usr/bin/python3
或/usr/bin/python
如果它们是符号链接);
/proc/[pid]/cmdline
还可能包含某些程序的奇怪信息,因此可能不可靠。这似乎与程序有关,但与内核无关,而且我没有观察到任何 python 脚本以这种方式运行(并且sys.argv
在 python 中编辑似乎不会影响/proc/[pid]/cmdline
)。我的问题也谈了一点这个。
答案2
实验上,对于 bash,/proc/{pid}/fd/255
是已执行脚本的完整路径的链接。
#! /bin/bash
ls -l /proc/$$/fd/255