如果我有一个进程的PID号(在UNIX计算机上),如何找到其相关进程的名称?

我该怎么办?

评论

您可以使用ps或ls -l / proc / $ PID / exe

@Eddy_Em将为您提供可执行文件,该文件并不总是进程名称。而且,那不是便携式的...

ps -fp PID将显示完整命令

readlink / proc / $ PID / exe

#1 楼

在所有符合POSIX的系统上,以及在Linux上,都可以使用ps:在此处,通过其PID与-p选择进程。 -o选项指定输出格式,comm表示命令名称。

对于完整命令,不仅是程序名称,请使用:

ps -p 1337 -o comm=


另请参见:ps –开放组基本规范第6期

评论


comm似乎将命令截断为15个字符。使用命令来修复它。

– Nemo
2014年8月15日在17:10

[Ubuntu 14.04.4 LTS] $ ps -p 1 -o comm = init $ ps -p 1 -o命令= / sbin / init;这意味着它大约不包含15个字符,可能只是二进制文件的名称及其完整路径。

–奥马尔·奥斯曼(OmarOthman)
16 Jul 23'9:48



实际上,comm给出二进制文件的名称,并且命令返回参数0

–罗比
17年1月1日在22:04

#2 楼

通过执行

/proc/<pid>/cmdline

,可以从

cat /proc/<pid>/cmdline


找到进程名称或进程ID或pid使用的命令。
此处pid是要为其查找名称的pid
例如:

 # ps aux

   ................
   ................
   user  2480  0.0  1.2 119100 12728 pts/0  Sl   22:42   0:01 gnome-terminal
   ................
   ................


查找pid 2480使用的进程名称您可以使用

# cat /proc/2480/cmdline 

 gnome-terminal


评论


注意:OP提到UNIX。并非所有UNIX都像计划特定的文件一样实现Plan 9。您的答案通常仅适用于Linux。

–slhck
13年8月17日在8:08



尽管这是事实,但他们确实将问题标记为“ linux”。使用非基于Linux的UNIX OS的任何人都将习惯于修改答案以适应他们的需求

–安德鲁·怀特(Andrew White)
17年5月9日,3:33

#3 楼

要使用某个pid获取程序的路径,您可以使用: >
ps ax|egrep "^ [PID]"


或者也:

ps -a [PID]


评论


ps -a列出与终端关联的所有进程,它不接受任何输入。

–李M
16 Mar 10 '16 at 18:30

@MichaelLee我猜想它取决于ps版本,在procps版本3.2.7上可以正常工作。

– Pedro Lobito
17年5月27日在13:11

#4 楼

# ls -la /proc/ID_GOES_HERE/exe


示例:

# ls -la /proc/1374/exe
lrwxrwxrwx 1 chmm chmm 0 Mai  5 20:46 /proc/1374/exe -> /usr/bin/telegram-desktop


评论


这是完美的。

– Jayarjo
16 Nov 17 '17:58

可能更好:readlink / proc / 1337 / exe。 readlink-打印已解析的符号链接或规范文件名。

– Pablo A
18 Mar 6 '18 at 0:58

有人评论了可执行文件名称不总是进程名称的问题,例如。 Gunicorn或Nginx。一些进程会在运行时使用setprocname对其进行更改

–ttimasdf
19年11月26日在2:44

但是,如果我想要可执行文件名称,则此/ proc方式是完美的。

–ttimasdf
19-11-26在2:45

#5 楼

您可以使用pmap。
我正在搜索PID6649。并删除多余的过程详细信息。

$ pmap 6649 | head -1
6649:   /usr/lib64/firefox/firefox


评论


该命令对我的帮助超过了我所需要的,我已经开始了整个过程。给定一个Java进程,使用ps命令,您将看到的只是java,但是传递的其余参数将与pmap一起完整显示。

–丹尼尔(Daniel Andrei)Mincă
18年8月31日在7:21

#6 楼

您也可以将awk与ps结合使用

ps aux | awk ' == PID number for a process  { print 
root@cprogrammer:~# ps aux | awk ' == 1 { print 
 ps --headers aux |head -n 1 && ps aux | awk ' == 1 { print q4312078q }'

                 (or) 

 ps --headers aux |head -n 1; ps aux | awk ' == 1 { print q4312078q }'


root@cprogrammer:~# ps --headers aux |head -n 1 && ps aux | awk ' == 1 { print q4312078q }'
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.2  24476  2436 ?        Ss   15:38   0:01 /sbin/init
}' root 1 0.0 0.2 24476 2436 ? Ss 15:38 0:01 /sbin/init
}'


示例:

q4312078q

打印HEAD LINE您可以使用

q4312078q

评论


这是不稳定的,因为它还会选择恰好在命令中任何地方包含数字的进程。尝试ps ax |例如,查看grep 1并查看它是否真的返回了init进程。 (就我而言,它返回119行,这是不希望的。)

–slhck
13年8月17日在9:41



@slhck修改了答案...感谢您提供信息。ps -p 1 -o comm =是此问题的最佳选择。

–甘加达
13年8月17日在11:07



我们不需要两次运行来保留标题,而是使用ps aux |。 awk'NR == 1 || $ 2 == PID'-不必说{print $ 0},因为它是默认值。但是正如您所评论的,-p还是更好。

–dave_thompson_085
16年5月6日在4:38



#7 楼

与松弛应答类似,但依赖文件操作而不是命令调用:

MYPID=1
cat "/proc/$MYPID/comm"


评论


[Ubuntu 14.04.4 LTS] cat / proc / 1 / comm => init,而不是/ sbin / init。他的回答包括更长的版本。但是无论如何+1。

–奥马尔·奥斯曼(OmarOthman)
16年7月23日在22:17

#8 楼

令人惊讶的是,没有人提到ps的-f(完整命令)选项。我喜欢将它与-e(所有内容)一起使用,并将结果通过管道传递到grep,这样我可以缩小搜索范围。某人正在运行的命令占用了您系统上的大量资源。这将向您显示传递给命令的选项和参数。

评论


在BSD上不起作用(也许包括MacOSX?我不确定)。即使在-e -f可用的地方,grep也会产生许多错误的匹配,例如grep 33包括pid = 933或339,ppid = 33或933或339,使用33秒或33分钟,或者包含33的程序名或自变量-包括grep本身。所有(AFAIK)ps都有-p,所以只有ps -fp 33。

–dave_thompson_085
16年5月6日在4:41



#9 楼

我发现最简单的方法是使用以下命令:

ps -awxs | grep pid


评论


除了与ps -p $ {pid}相比效率极低外,这还会产生大量误报-包括grep本身。

– Toby Speight
16年11月22日在16:55

#10 楼

制作了一个简单的脚本来查找PID并在bash脚本中使用...
请谨慎使用!

http://pastebin.com/Cm9YH67U

安德烈

评论


404,一个很好的例子,为什么仅链接的答案是错误的。

– Pedro Lobito
20年5月1日在13:53