在 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 訊號來終止。使用此方法殺死正在執行的程式允許在大量程式不斷執行的情況下。需要關閉程式。