是否可以找到正在运行的程序的路径?

是否可以找到正在运行的程序的路径?

我有一个xmms2d进程正在运行,但两个可能的可执行文件(在不同的目录中,都在可执行路径中)可能会生成它。我怀疑其中之一已损坏,因为该程序有时可以工作,有时则不能。现在正在运行的进程可以正常运行,因此我想删除(或重命名)另一个进程。

ps ax|grep "xmms"返回时8505 ? SLl 2:38 xmms2d -v不带路径信息。给定 PID,我可以找到它是否是从/usr/bin/xmms2d或运行的吗/usr/local/bin/xmms2d

谢谢!

答案1

尝试这个:

ls -l /proc/8505/exe

或者,如果您不想解析 的输出ls,只需执行以下操作:

readlink /proc/8505/exe

或者

realpath /proc/8505/exe

答案2

如果您运行的是 Solaris,则建议的方式与 Linux 略有不同:

$ for i in $(pgrep bash)
do
  printf "%6d %s\n" $i $(readlink /proc/$i/path/a.out)
done
   577 /usr/bin/bash
 11247 /usr/bin/bash
 13921 /usr/bin/bash
 13992 /tmp/bash

如果您想知道正在运行的进程的当前工作目录,可以使用:

pwdx $(pgrep xmms)

例如:

$ pwdx $(pgrep ksh)
2904: /home/jlliagre
2906: /home/jlliagre
3844: /tmp

答案3

我从 shell 启动鼠标垫:

mousepad & 
[1] 24289

检查一下,它来自哪里:

which mousepad 
   /usr/bin/mousepad

以路径开始:

/usr/bin/mousepad &

通过ps查看:

ps v -C mousepad 
  PID TTY      STAT   TIME  MAJFL   TRS   DRS   RSS %MEM COMMAND
24289 pts/3    S      0:00      3    62 85441 10964  1.0 mousepad
24292 pts/3    S      0:00      0    62 85433 10864  1.0 /usr/bin/mousepad

正如我们所看到的,没有路径调用的那个显示没有路径,并且以 PATH 开头,因此可以通过

which mousepad

就这么简单,不是吗?等待!如果我从菜单启动鼠标垫会怎样?嗯,可以使用或不使用 PATH 设置来指定它。我试过。正常启动会生成一个简单的“鼠标垫” ps v -C。由于 ~/bin 是我的 PATH 的第一部分,我在那里创建了一个虚拟程序,瞧,该虚拟程序是从菜单启动的。

但是,如果您启动的程序会自行删除怎么办?如果路径中存在第二个程序,则不会找到已删除的程序并报告错误的程序。

这就是竞争条件。如果您知道您的程序在您调查其位置时不会自行删除或移动,ps v -C NAME并且which NAME应该运行良好。

答案4

继续删除这两个文件(不使用强制 -f 选项)。被删除的文件是未运行的文件!

系统可执行文件锁定将不允许您删除当前正在执行的任何文件。

相关内容