Linux中4個簡單的找出進(jìn)程ID(PID)方法
每個人都知道 PID,究竟什么是 PID?為什么你想要 PID?你打算用 PID 做什么?你腦子里有同樣的問題嗎?如果是這樣,你就找對地方了解這些細(xì)節(jié)了。
我們查詢 PID 主要是用來殺死一個沒有響應(yīng)的程序,它類似于 Windows 任務(wù)管理器一樣。 Linux GUI 也提供相同的功能,但 CLI 是執(zhí)行 kill
操作的有效方法。
什么是進(jìn)程 ID?
PID 代表進(jìn)程標(biāo)識號,它在大多數(shù)操作系統(tǒng)內(nèi)核(如 Linux、Unix、macOS 和 Windows)中使用。它是在操作系統(tǒng)中創(chuàng)建時自動分配給每個進(jìn)程的唯一標(biāo)識號。一個進(jìn)程是一個正在運(yùn)行的程序?qū)嵗?/p>
建議閱讀: 如何查看 Apache Web 服務(wù)器在 Linux 中的運(yùn)行時間
除了 init 進(jìn)程外其他所有的進(jìn)程 ID 每次都會改變,因?yàn)?init 始終是系統(tǒng)上的***個進(jìn)程,并且是所有其他進(jìn)程的父進(jìn)程。它的 PID 是 1。
PID 默認(rèn)的***值是 32768
??梢栽谀愕南到y(tǒng)上運(yùn)行 cat /proc/sys/kernel/pid_max
來驗(yàn)證。在 32 位系統(tǒng)上,32768
是***值,但是我們可以在 64 位系統(tǒng)上將其設(shè)置為*** 222(約 4 百萬)內(nèi)的任何值。
你可能會問,為什么我們需要這么多的 PID?因?yàn)槲覀儾荒芰⒓粗赜?PID,這就是為什么。另外為了防止可能的錯誤。
系統(tǒng)正在運(yùn)行的進(jìn)程的 PID 可以通過使用 pidof
、pgrep
、ps
和 pstree
命令找到。
方法 1:使用 pidof 命令
pidof
用于查找正在運(yùn)行的程序的進(jìn)程 ID。它在標(biāo)準(zhǔn)輸出上打印這些 id。為了演示,我們將在 Debian 9(stretch)系統(tǒng)中找出 Apache2 的進(jìn)程 ID。
# pidof apache2
3754 2594 2365 2364 2363 2362 2361
從上面的輸出中,你可能會遇到難以識別進(jìn)程 ID 的問題,因?yàn)樗ㄟ^進(jìn)程名稱顯示了所有的 PID(包括父進(jìn)程和子進(jìn)程)。因此,我們需要找出父 PID(PPID),這是我們要查找的。它可能是***個數(shù)字。在本例中,它是 3754
,并按降序排列。
方法 2:使用 pgrep 命令
pgrep
遍歷當(dāng)前正在運(yùn)行的進(jìn)程,并將符合選擇條件的進(jìn)程 ID 列到標(biāo)準(zhǔn)輸出中。
# pgrep apache2
2361
2362
2363
2364
2365
2594
3754
這也與上面的輸出類似,但是它將結(jié)果從小到大排序,這清楚地說明父 PID 是***一個。在本例中,它是 3754
。
注意: 如果你有多個進(jìn)程的進(jìn)程 ID,那么在使用 pidof
和 pgrep
識別父進(jìn)程 ID 時就可能不會很順利。
方法 3:使用 pstree 命令
pstree
將運(yùn)行的進(jìn)程顯示為一棵樹。樹的根是某個 pid,如果省略了 pid 參數(shù),那么就是 init。如果在 pstree
命令中指定了用戶名,則顯示相應(yīng)用戶擁有的所有進(jìn)程。
pstree
會將相同的分支放在方括號中,并添加重復(fù)計數(shù)的前綴來可視化地合并到一起。
# pstree -p | grep "apache2"
|- apache2(3754) -|-apache2(2361)
| |-apache2(2362)
| |-apache2(2363)
| |-apache2(2364)
| |-apache2(2365)
| `-apache2(2594)
要單獨(dú)獲取父進(jìn)程,請使用以下格式。
# pstree -p | grep "apache2" | head -1
|- apache2(3754) -|-apache2(2361)
pstree
命令非常簡單,因?yàn)樗謩e隔離了父進(jìn)程和子進(jìn)程,但這在使用 pidof
和 pgrep
時命令不容易做到。
方法 4:使用 ps 命令
ps
顯示活動進(jìn)程的選擇信息。它顯示進(jìn)程 ID(pid
=PID)、與進(jìn)程關(guān)聯(lián)的終端(tname
=TTY)、以 [DD-]hh:mm:ss
格式(time
=TIME)顯示的累計 CPU 時間、以及執(zhí)行名(ucmd
= CMD)。輸出默認(rèn)是未排序的。
# ps aux | grep "apache2"
www-data 2361 0.0 0.4 302652 9732 ? S 06:25 0:00 /usr/sbin/apache2 -k start
www-data 2362 0.0 0.4 302652 9732 ? S 06:25 0:00 /usr/sbin/apache2 -k start
www-data 2363 0.0 0.4 302652 9732 ? S 06:25 0:00 /usr/sbin/apache2 -k start
www-data 2364 0.0 0.4 302652 9732 ? S 06:25 0:00 /usr/sbin/apache2 -k start
www-data 2365 0.0 0.4 302652 8400 ? S 06:25 0:00 /usr/sbin/apache2 -k start
www-data 2594 0.0 0.4 302652 8400 ? S 06:55 0:00 /usr/sbin/apache2 -k start
root 3754 0.0 1.4 302580 29324 ? Ss Dec11 0:23 /usr/sbin/apache2 -k start
root 5648 0.0 0.0 12784 940 pts/0 S+ 21:32 0:00 grep apache2
從上面的輸出中,我們可以根據(jù)進(jìn)程的啟動日期輕松地識別父進(jìn)程 ID(PPID)。在此例中,apache2 啟動于 Dec 11
,它是父進(jìn)程,其他的是子進(jìn)程。apache2 的 PID 是 3754
。