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


17

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

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

谢谢!


2
ps -C xmms应该会使您的grep过时。
用户未知

1
pgrep也可以做到。
jlliagre 2011年

Answers:


22

尝试这个:

ls -l /proc/8505/exe

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

readlink /proc/8505/exe

要么

realpath /proc/8505/exe

6

如果您运行的是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

(删除了我的评论,因为它在您编辑后不再应用:)
Kjetil Jorgensen

-1

我从外壳启动鼠标垫:

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 NAMEwhich NAME应工作得很好。


这会一直有效吗?假设我在两个不同的目录中都有一个可执行文件,并且在两个目录./someexecutable中都运行?
apoorv020 2011年

不,当然不是,因为两者都将显示为./someexecutable或/ bin / bash ./someexecutable
用户未知,

-4

继续并删除两个文件(不带force -f选项)。被删除的文件是一个,没有运行!

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


您的答案并未提供问题的真实答案。
Risto Salminen

4
这也是错误的。您可以删除正在运行的可执行文件,而不会出现问题。您如何看待init始终运行的软件包(如)的升级?您无法修改正在运行的可执行文件。
Patrick

1
这是错误的警告-请勿这样做
Michael Mrozek
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.