如果我知道一个进程的PID编号,如何获得它的名称?


263

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

我需要做什么?


9
您可以使用psls -l /proc/$PID/exe
Eddy_Em

1
@Eddy_Em将为您提供可执行文件,该文件并不总是进程名称。另外,那也不是可移植的……
derobert

9
ps -fp PID将展示完整的命令
Temak

Answers:


283

在所有符合POSIX的系统上,对于Linux,您可以使用ps

ps -p 1337 -o comm=

在此,通过过程的PID选择过程-p。该-o选项指定输出格式,comm即命令名称。

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


28
comm似乎将命令截断为15个字符。使用command代替修复它。
Nemo

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

3
实际上,comm给出二进制文件的名称并command返回参数0
robbie

45

您可以从以下位置找到进程名称或process-id或pid使用的命令

/proc/pid/cmdline

通过做

cat /proc/pid/cmdline

pid是您要为其查找名称
例如exmaple 的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

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

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

14

要使用某个pid获取程序的路径,可以使用:

ps ax|egrep "^ [PID]"

或者,您可以使用:

ps -a [PID]

在此处输入图片说明


1
ps -a列出与终端关联的所有进程,不需要任何输入。
Michael Lee

@MichaelLee我想它取决于ps版本,procps version 3.2.7工作正常。
Pedro Lobito

8
# 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

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

8

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

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

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

3

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

ps aux | awk '$2 == PID number for a process  { print $0 }'

例:

root@cprogrammer:~# ps aux | awk '$2 == 1 { print $0 }'
root         1  0.0  0.2  24476  2436 ?        Ss   15:38   0:01 /sbin/init    

打印HEAD LINE,您可以使用

 ps --headers aux |head -n 1 && ps aux | awk '$2 == 1 { print $0 }'

                 (or) 

 ps --headers aux |head -n 1; ps aux | awk '$2 == 1 { print $0 }'


root@cprogrammer:~# ps --headers aux |head -n 1 && ps aux | awk '$2 == 1 { print $0 }'
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

2
这是不稳定的,因为它还会选择恰好在命令中任何地方都包含数字的进程。例如,尝试ps ax | grep 1查看它是否确实返回了该init过程。(在我的情况下,它返回119行-不理想。)
slhck

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

我们不需要两次运行即可保留标题,而无需使用ps aux | awk 'NR==1 || $2==PID'-,{print $0}因为这是默认设置,因此无需多说。但是正如您所评论的,-p还是更好。
dave_thompson_085 '16

3

slhck的Answer类似,但依赖于文件操作而不是命令调用:

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

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

2

令人惊讶的是,没有人提到ps的-f(完整命令)选项。我喜欢将它与-e(所有)一起使用,并将结果通过管道传递到grep,以便缩小搜索范围。

ps -ef | grep <PID>

这对于查看正在运行的正在占用系统大量资源的完整命令也非常有用。这将向您显示传递给命令的选项和参数。


3
在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

0

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

ps -awxs | grep pid

除了效率极低之外ps -p${pid},这还会带来许多误报-包括错误grep本身。
Toby Speight

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.