在 Linux 中殺死程序組的所有成員


概述

作為 Linux 系統管理員,處理程序是一項頻繁的任務。通常,停止它們很容易,但在某些情況下——當同一組中存在大量程序時——可能需要採取其他步驟。

我們將更仔細地研究如何使用“組”的概念來管理程序。以及如何終止屬於特定組的所有程序。

程序組

Linux 中的程序分組是一種 Linux 程序共享相同 PID(程序 ID)的方式。它們是一組相關的程序,共享相同的 PID。

殺死父程序並不一定意味著子程序也會被殺死。但是,如果我們殺死父程序,它們將不再執行。因此,我們將瞭解如何殺死特定的 pid(屬於父程序的 pid)來停止其所有關聯的 pid。

對於每個程序組,都有一個組長,其程序 ID(PGID)與組中的所有其他成員相同。

設定分組程序列表

我們假設一個正在執行的應用程式層次結構的情況。因此,我們將編寫三個程式,它們將相互呼叫,建立許多子程序組。

讓我們建立一個名為 parent.sh 的 shell 指令碼,其內容如下:

#!/bin/bash
bash parent.sh &
bash parent.sh &
for i in {1..100}; do 
sleep 2; 
echo -n "This is the grandparent process $i"; 
done

現在讓我們新增另一個名為 parent.sh 的指令碼和一個名為 children.sh 的指令碼。

#!/bin/bash
bash children.sh &
bash children.sh &
for i in {1..100}; do sleep 2; echo -n "This is the parent process $i"; 
done
#!/bin/bash
for i in {1..100}; do 
sleep 2; 
echo -n "This is a test in children process $i"; 
done

現在讓我們執行最頂層的 shell 檔案,它將使用以下命令啟動其他程序:

./grandparent.sh

使用 ps 命令查詢程序組

我們將使用 ps 獲取當前正在執行的程序列表。

  • -e − 選擇所有程序

  • -f − 預設情況下,ps 命令不顯示完整格式的列表和 PGID 以及其他列作為選項。

  • -j − 以作業格式列出程序。

$ ps -efj
UID          PID    PPID    PGID     SID  C STIME TTY          TIME CMD
root           1       0       1       1  0 11:18 ?        00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 18
root           2       0       0       0  0 11:18 ?        00:00:00 [kthreadd]
root           3       2       0       0  0 11:18 ?        00:00:00 [rcu_gp]
root           4       2       0       0  0 11:18 ?        00:00:00 [rcu_par_gp]
root           6       2       0       0  0 11:18 ?        00:00:00 [kworker/0:0H]
root           8       2       0       0  0 11:18 ?        00:00:00 [mm_percpu_wq]
root           9       2       0       0  0 11:18 ?        00:00:00 [ksoftirqd/0]
root          10       2       0       0  0 11:18 ?        00:00:00 [rcu_sched]

過濾程序列表輸出

如果您的計算機中有多個程序正在執行,則可能需要過濾輸出。我們將研究如何使用一些工具來幫助我們識別要終止的程序的程序組 ID(PGID)。

根據我們在第 3 節中構建的設定,應該有一組具有相同 PGID 的程序。

$ ps -efj | egrep "PGID|children|parent"

UID          PID    PPID    PGID     SID  C STIME TTY          TIME CMD
vagrant     6389    5377    6389    5377  0 12:49 pts/0    00:00:00 bash grandparent.sh
vagrant     6390    6389    6389    5377  0 12:49 pts/0    00:00:00 bash parent.sh
vagrant     6391    6389    6389    5377  0 12:49 pts/0    00:00:00 bash parent.sh
vagrant     6393    6390    6389    5377  0 12:49 pts/0    00:00:00 bash children.sh
vagrant     6394    6390    6389    5377  0 12:49 pts/0    00:00:00 bash children.sh
vagrant     6395    6391    6389    5377  0 12:49 pts/0    00:00:00 bash children.sh
vagrant     6397    6391    6389    5377  0 12:49 pts/0    00:00:00 bash children.sh
vagrant     6440    4570    6439    4570  0 12:49 pts/1    00:00:00 grep -E --color=auto PGID|children|parent

第 2 節討論了第一個程序執行所有其他程式的 PID。然後將這些 PID 分配給所有其他正在執行的程式。

使用 PGID 殺死程序

我們將使用 kill 命令透過向程序傳送 kill 訊號來終止程序。以下是如何執行 kill 命令的示例:

kill -- -$PGID

兩個破折號 (--) 表示預設的 SIGTERM 訊號。根據圖 5,我們要殺死的程序組的 PGID 為 6389。知道這一點,我們就知道可以使用“kill”命令殺死該組。

kill -- -6389

我們還可以使用通常與程序一起使用的訊號。例如,如果我們想使用 SIGKILL –9 終止程序組,那麼我們會輸入:

kill -9 -6389

SIGQUIT 可用於向組內的程序傳送終端退出訊號。

kill -SIGQUIT -6389

結論

我們學習瞭如何使用“kill”命令終止屬於同一程序組的程序。您可以透過傳送 SIGTERM 或 SIG QUIT 訊號來終止。使用此方法殺死正在執行的程式允許在大量程式不斷執行的情況下。需要關閉程式。

更新於: 2023 年 1 月 3 日

1K+ 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始
廣告