透過管道殺死所有掛起的進程

透過管道殺死所有掛起的進程

我正在運行一個腳本,在殺死之前必須暫停該腳本。我第一次運行它時,該進程只有一個 pid。我殺死它並再次運行,PID 的數量不斷增加。首先,為什麼會有這種行為?如何在不明確提及每個 PID 的情況下殺死所有掛起的進程?

./toplog.sh

暫停:

Ctrl-Z

列出掛起的進程:

jobs -l

輸出:

[1]  12055 Stopped                 ./toplog.sh
[2]  12752 Stopped                 ./toplog.sh
[3]- 13276 Stopped                 ./toplog.sh
[4]+ 13579 Stopped                 ./toplog.sh

殺戮:

kill 12055 12752 13276 13579

答案1

我正在運行一個腳本,在殺死之前必須暫停該腳本。

呃,不。腳本在終止之前不需要暫停。你可以隨時殺死它。

我第一次運行它時,該進程只有一個 pid。我殺死它並再次運行,PID 的數量不斷增加。

那麼你實際上並沒有殺死它!如果執行./toplog.sh並掛起它,則只會建立一個作業,即 的輸出中的一行jobs。腳本本身可能會建立多個進程,但jobs僅列出腳本本身(技術術語為進程組領導者)。如果您看到越來越多的工作,這意味著您仍然看到您試圖取消但未成功的舊工作。

你未能殺死這些工作的原因可能是因為它們被暫停了。當進程被掛起時,它無法對訊號做出反應。如果向掛起的進程發送訊號,則該訊號僅在進程復原時才有效。異常是由核心直接管理的訊號,不涉及進程。其中一個例外是恢復進程的訊號 (SIGCONT) 顯然會立即喚醒進程。另一類異常是在不詢問的情況下終止進程的訊號:這始終包括 SIGKILL,如果進程尚未為該訊號設定處理程序,還包括其他訊號(SIGINT、SIGHUP、SIGTERM、SIGQUIT 等)。

如果kill %1終止作業 1,那麼 shell 會告訴您作業已終止。如果進程設定了 SIGTERM 處理程序,則kill %1在進程掛起時無效;要終止該進程,您還需要恢復它:

kill %1; kill -CONT %1

如果您想強制終止該進程而不給它任何清理機會,那麼請執行以下操作

kill -KILL %1

(或kill -9 %1簡稱)。

如果您想終止所有toplog.sh進程,無論它們是否從該終端啟動,您可以使用pkill toplog.sh.

答案2

當您知道執行時間如何呼叫進程時(在本例中是toplog.sh),您可以終止腳本的所有實例。

ps x | grep toplog.sh | grep -v grep | cut -d" " -f1 | xargs kill -9

ps x為您提供所有進程的列表,將從目標進程中進行 grep 操作。第二個 grep 只是確保從清單中刪除 grep 呼叫本身。否則你會得到一個錯誤(事實上這仍然沒有問題,但很難看)。切 -d" " -f1將每一行分成多個部分,並以空格字元劃分,其中 *-f1** 佔據第一部分。xargs殺-9殺死之前從命令鏈中拋出的每個 pid。

為了方便起見,您可以將此行放入終止腳本中,其中進程名稱將替換為終止腳本參數:

#!/bin/bash
ps x | grep $1 | grep -v grep | cut -d" " -f1 | xargs kill -9

然後使用要終止的進程的名稱呼叫該腳本。

./kill.sh toplog.sh

相關內容