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。可以在你的系統(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 apache23754 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 apache22361236223632364236525943754
這也與上面的輸出類似,但是它將結(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ù)計(jì)數(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)顯示的累計(jì) 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 startwww-data 2362 0.0 0.4 302652 9732 ? S 06:25 0:00 /usr/sbin/apache2 -k startwww-data 2363 0.0 0.4 302652 9732 ? S 06:25 0:00 /usr/sbin/apache2 -k startwww-data 2364 0.0 0.4 302652 9732 ? S 06:25 0:00 /usr/sbin/apache2 -k startwww-data 2365 0.0 0.4 302652 8400 ? S 06:25 0:00 /usr/sbin/apache2 -k startwww-data 2594 0.0 0.4 302652 8400 ? S 06:55 0:00 /usr/sbin/apache2 -k startroot 3754 0.0 1.4 302580 29324 ? Ss Dec11 0:23 /usr/sbin/apache2 -k startroot 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。



















