Linux中國

Linux 中 4 個簡單的找出進程 ID(PID)的方法

每個人都知道 PID,究竟什麼是 PID?為什麼你想要 PID?你打算用 PID 做什麼?你腦子裡有同樣的問題嗎?如果是這樣,你就找對地方了解這些細節了。

我們查詢 PID 主要是用來殺死一個沒有響應的程序,它類似於 Windows 任務管理器一樣。 Linux GUI 也提供相同的功能,但 CLI 是執行 kill 操作的有效方法。

什麼是進程 ID?

PID 代表 進程標識號 process identification ,它在大多數操作系統內核(如 Linux、Unix、macOS 和 Windows)中使用。它是在操作系統中創建時自動分配給每個進程的唯一標識號。一個進程是一個正在運行的程序實例。

建議閱讀: 如何查看 Apache Web 伺服器在 Linux 中的運行時間

除了 init 進程外其他所有的進程 ID 每次都會改變,因為 init 始終是系統上的第一個進程,並且是所有其他進程的父進程。它的 PID 是 1。

PID 默認的最大值是 32768。可以在你的系統上運行 cat /proc/sys/kernel/pid_max 來驗證。在 32 位系統上,32768 是最大值,但是我們可以在 64 位系統上將其設置為最大 2 22(約 4 百萬)內的任何值。

你可能會問,為什麼我們需要這麼多的 PID?因為我們不能立即重用 PID,這就是為什麼。另外為了防止可能的錯誤。

系統正在運行的進程的 PID 可以通過使用 pidofpgreppspstree 命令找到。

方法 1:使用 pidof 命令

pidof 用於查找正在運行的程序的進程 ID。它在標準輸出上列印這些 id。為了演示,我們將在 Debian 9(stretch)系統中找出 Apache2 的進程 ID。

# pidof apache2
3754 2594 2365 2364 2363 2362 2361

從上面的輸出中,你可能會遇到難以識別進程 ID 的問題,因為它通過進程名稱顯示了所有的 PID(包括父進程和子進程)。因此,我們需要找出父 PID(PPID),這是我們要查找的。它可能是第一個數字。在本例中,它是 3754,並按降序排列。

方法 2:使用 pgrep 命令

pgrep 遍歷當前正在運行的進程,並將符合選擇條件的進程 ID 列到標準輸出中。

# pgrep apache2
2361
2362
2363
2364
2365
2594
3754

這也與上面的輸出類似,但是它將結果從小到大排序,這清楚地說明父 PID 是最後一個。在本例中,它是 3754

注意: 如果你有多個進程的進程 ID,那麼在使用 pidofpgrep 識別父進程 ID 時就可能不會很順利。

方法 3:使用 pstree 命令

pstree 將運行的進程顯示為一棵樹。樹的根是某個 pid,如果省略了 pid 參數,那麼就是 init。如果在 pstree 命令中指定了用戶名,則顯示相應用戶擁有的所有進程。

pstree 會將相同的分支放在方括弧中,並添加重複計數的前綴來可視化地合併到一起。

# pstree -p | grep "apache2"
 |- apache2(3754) -|-apache2(2361)
 | |-apache2(2362)
 | |-apache2(2363)
 | |-apache2(2364)
 | |-apache2(2365)
 | `-apache2(2594)

要單獨獲取父進程,請使用以下格式。

# pstree -p | grep "apache2" | head -1
 |- apache2(3754) -|-apache2(2361)

pstree 命令非常簡單,因為它分別隔離了父進程和子進程,但這在使用 pidofpgrep 時命令不容易做到。

方法 4:使用 ps 命令

ps 顯示活動進程的選擇信息。它顯示進程 ID(pid=PID)、與進程關聯的終端(tname=TTY)、以 [DD-]hh:mm:ss 格式(time=TIME)顯示的累計 CPU 時間、以及執行名(ucmd = CMD)。輸出默認是未排序的。

# 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

從上面的輸出中,我們可以根據進程的啟動日期輕鬆地識別父進程 ID(PPID)。在此例中,apache2 啟動於 Dec 11,它是父進程,其他的是子進程。apache2 的 PID 是 3754

via: https://www.2daygeek.com/how-to-check-find-the-process-id-pid-ppid-of-a-running-program-in-linux/

作者:Magesh Maruthamuthu 譯者:geekpi 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國