
我正在運行一個腳本,在殺死之前必須暫停該腳本。我第一次運行它時,該進程只有一個 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