![查找当前正在运行的进程的可执行文件的位置](https://linux22.com/image/1451707/%E6%9F%A5%E6%89%BE%E5%BD%93%E5%89%8D%E6%AD%A3%E5%9C%A8%E8%BF%90%E8%A1%8C%E7%9A%84%E8%BF%9B%E7%A8%8B%E7%9A%84%E5%8F%AF%E6%89%A7%E8%A1%8C%E6%96%87%E4%BB%B6%E7%9A%84%E4%BD%8D%E7%BD%AE.png)
如果我有 2 个可执行文件(/path/to/gcc/myapp.exe
、 和/path/to/intel/myapp.exe
),其中一个使用 intel 编译器编译,另一个使用标准 gcc 编译,则运行这两个文件时都将显示top
为myapp
。如果我运行这两个文件,并且进程以 运行myapp
,有没有办法找出哪个进程来自哪个可执行文件?
我们的集群上安装了许多应用程序,我感兴趣的不仅是哪些应用程序使用得最多,还版本的应用程序正在使用。如果我看到 500 次R
运行,我想知道其中 100 次是否来自/path/to/R-3.2.1/intel/R
,其他 400 次是否来自/path/to/R-3.1.3/gcc/R
,等等。我该怎么做?
答案1
您可以使用/proc
文件系统执行此操作,如proc(5)
手册页:
/proc/[pid]/exe
在 Linux 2.2 及更高版本中,此文件是一个符号链接,包含所执行命令的实际路径名。
因为它是一个符号链接,您可以阅读目标(执行ls -l
来查看路径名)。
当然,这[pid]
意味着在运行时您感兴趣的特定可执行文件的进程 ID。
(您的系统不太可能运行那么旧的 Linux 内核,因此“始终有效”应该足够了)。
要获得计数,你只需要一个脚本来遍历/proc
你拥有的每个目录(因为你正在运行程序,所以你可以看到它们的/proc
数据),并将路径名与你感兴趣的路径名进行匹配。readlink
例如,程序在 Bash 脚本中很有用(并且因为它是 的一部分coreutils
,所以您很可能在 Linux 系统上使用它)。
答案2
为此,您可以启动top
,然后按下c
键盘上的按钮切换完整路径视图。
答案3
如果这些进程是使用不同的命令行执行的(例如,使用完整路径),您可以按c
显示/隐藏执行该进程的完整命令行。