題 如果我知道進程的PID號,我該如何得到它的名字?


如果我有一個進程的PID號(在UNIX機器上),我如何找到其關聯進程的名稱?

我需要做什麼?


215
2017-08-17 07:12


起源


您可以使用 ps 要么 ls -l /proc/$PID/exe - Eddy_Em
@Eddy_Em它將為您提供可執行文件,該文件並不總是進程名稱。而且,這不便攜...... - derobert
ps -fp PID 將顯示完整的命令 - Temak


答案:


在所有符合POSIX的系統和Linux上,您都可以使用 ps

ps -p 1337 -o comm=

這裡,過程由其PID選擇 -p。該 -o 選項指定輸出格式, comm 意思是命令名稱。

也可以看看: ps  - 公開集團基本規格問題6


233
2017-08-17 08:21



comm似乎將命令截斷為15個字符。運用 command 而是修復它。 - Nemo
[Ubuntu 14.04.4 LTS] $ ps -p 1 -o comm=  在裡面 $ ps -p 1 -o command=  / sbin目錄/初始化;這意味著它不是大約15個字符,也許只是二進製文件的名稱與其完整路徑。 - OmarOthman
其實, comm 給出二進製文件的名稱和 command 返回參數0 - robbie0630


您可以找到進程名稱或process-id或pid使用的命令

/proc/pid/cmdline

通過做

cat /proc/pid/cmdline

這裡pid是你想要找到名字的pid
例如:

 # ps aux

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

要查找pid 2480使用的進程名稱,請使用can

# cat /proc/2480/cmdline 

 gnome-terminal

39
2017-08-17 08:04



小心:OP提到了UNIX。並非所有UNIX都像特定於流程的文件那樣實施Plan 9。您的答案通常僅適用於Linux。 - slhck
雖然這是真的,但他們確實標記了“linux”這個問題。任何使用非基於Linux的UNIX操作系統的人都會習慣於修改答案以滿足他們的需求 - Andrew White


要使用某個pid獲取程序的路徑,您可以使用:

ps ax|egrep "^ [PID]"

或者您可以使用:

ps -a [PID]

enter image description here


12
2018-04-18 02:16



ps -a 列出與終端關聯的所有進程,它不接受任何輸入。 - Michael Lee
@MichaelLee我想它依賴於 ps 版本,開 procps version 3.2.7 工作良好。 - Pedro Lobito


# 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

7
2018-05-06 00:14



這個很完美。 - jayarjo
可能更好: readlink /proc/1337/exe。 readlink - 打印已解析的符號鏈接或規範文件名。 - Pablo Bianchi


你可以使用pmap。 我正在尋找PID 6649.並切斷了額外的工藝細節。

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

6
2018-05-27 04:28



這個命令對我的幫助超過了我的需要,我完成了整個過程。給定一個Java進程,用 ps 命令所有你會看到的只是 java,但傳遞的其餘參數將完全顯示 pmap。 - Mincă Daniel Andrei


您還可以將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

3
2017-08-17 09:32



這是不穩定的,因為它還會選擇恰好在其命令中的任何位置包含數字的進程。嘗試 ps ax | grep 1 並看看它是否真的回歸了 init 例如,過程。 (在我的情況下,它返回119行 - 不可取。) - slhck
@slhck修改了答案...感謝您的信息.. ps -p 1 -o comm = 是這個問題的最佳選擇。 - Gangadhar
我們不需要兩次運行來保留標頭,而是使用 ps aux | awk 'NR==1 || $2==PID'  - 而且不需要說 {print $0} 因為這是默認值。但正如你評論的那樣, -p 反正更好。 - dave_thompson_085


西米拉爾 slhck的答案,但依賴於文件操作而不是命令調用:

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

2
2017-08-30 23:31



[Ubuntu 14.04.4 LTS] cat /proc/1/comm => init,而不是/ sbin / init。他的答案包括更長的版本。但無論如何+1。 - OmarOthman


令人驚訝的是,沒有人提到ps的-f(完整命令)選項。我喜歡將它與-e(所有內容)一起使用並將結果傳遞給grep,這樣我就可以縮小搜索範圍。

ps -ef | grep <PID>

這對於查看正在運行的正在佔用系統上大量資源的完整命令也非常有用。這將顯示傳遞給命令的選項和參數。


2
2018-02-23 21:47



不適用於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