如何获取当前运行脚本文件的路径?

如何获取当前运行脚本文件的路径?

知道该程序的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包含初始环境变量(即使程序本身改变了里面的环境变量,也不会改变),包括PWDPATH

因此:
如果 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

相关内容