如何使用 kill、pkill 和 killall 結束程序


在使用基於 Unix 的作業系統(如 Linux 或 macOS)時,經常會遇到程序無響應或需要出於某種原因終止的情況。幸運的是,有一些可用的命令列實用程式允許使用者以多種方式結束程序。在本文中,我們將探討三種最常用的用於終止程序的實用程式:kill、pkill 和 killall。我們將介紹它們的用法、常見選項以及如何在 Unix 系統上使用它們來管理程序的示例。

kill、pkill 和 killall 的基本用法

在深入研究具體示例之前,瞭解每個實用程式的基本用法很有幫助。

kill 是一種命令列實用程式,用於向程序傳送訊號以終止它。預設情況下,kill 傳送 TERM 訊號,要求程序優雅地終止自身。如果程序對 TERM 訊號沒有響應,則可以傳送 KILL 訊號,該訊號會立即終止程序。

pkill 與 kill 類似,但它允許您根據程序名稱或其他屬性向程序傳送訊號。例如,您可以使用 pkill firefox 終止所有 Firefox 瀏覽器例項。

killall 與 pkill 類似,但它僅根據名稱匹配程序。當您想終止特定程式的所有例項時,這很有用。

使用 kill 的示例

讓我們從一些使用 kill 結束程序的示例開始。

根據 PID 終止單個程序

kill 最基本的用法是根據其程序 ID (PID) 終止單個程序。要查詢程序的 PID,您可以使用 ps 命令 -

$ ps aux | grep process_name

這將顯示與指定名稱匹配的程序列表。輸出的第二列顯示每個程序的 PID。

獲得 PID 後,您可以使用 kill 命令終止程序 -

$ kill pid

例如,要終止 PID 為 1234 的程序,您將執行 -

$ kill 1234

這將向程序傳送 TERM 訊號,要求它優雅地終止自身。如果程序沒有響應,您可以使用 -9 選項傳送 KILL 訊號,這將立即終止程序 -

$ kill -9 1234

根據 PID 終止多個程序

如果您需要一次終止多個程序,則可以將多個 PID 值傳遞給 kill。例如,要終止 PID 為 1234 和 5678 的程序,您將執行 -

$ kill 1234 5678

終止屬於某個使用者的全部程序

如果您想終止屬於特定使用者的全部程序,則可以使用 -u 選項指定使用者的使用者名稱。例如,要終止屬於使用者“jdoe”的所有程序,您將執行 -

$ kill -u jdoe

使用 pkill 的示例

接下來,讓我們看看一些使用 pkill 終止程序的示例。

根據名稱終止程序

pkill 最基本的用法是根據名稱終止程序。例如,要終止所有 Firefox 瀏覽器例項,您將執行 -

$ pkill firefox

這將向名稱包含“firefox”的所有程序傳送 TERM 訊號。如果這些程序中的任何一個沒有響應 TERM 訊號,則將向其傳送 KILL 訊號。

根據程序組 ID 終止程序

除了根據名稱終止程序外,pkill 還可以根據其程序組 ID (PGID) 終止程序。PGID 是作業系統為每個程序組分配的唯一識別符號。要終止特定程序組中的所有程序,您可以使用 -g 選項後跟 PGID。例如,要終止程序組 1234 中的所有程序,您將執行 -

$ pkill -g 1234

根據使用者終止程序

pkill 還允許您根據擁有它們的使用者的程序終止程序。您可以使用 -u 選項指定使用者的使用者名稱。例如,要終止屬於使用者“jdoe”的所有程序,您將執行 -

$ pkill -u jdoe

使用 killall 的示例

最後,讓我們看看一些使用 killall 終止程序的示例。

根據名稱終止程序

killall 最基本的用法是根據名稱終止程序。例如,要終止所有 Firefox 瀏覽器例項,您將執行 -

$ killall firefox

這將向名稱為“firefox”的所有程序傳送 TERM 訊號。如果這些程序中的任何一個沒有響應 TERM 訊號,則將向其傳送 KILL 訊號。

根據使用者終止程序

與 pkill 一樣,killall 也允許您根據擁有它們的使用者的程序終止程序。您可以使用 -u 選項指定使用者的使用者名稱。例如,要終止屬於使用者“jdoe”的所有程序,您將執行 -

$ killall -u jdoe

根據組終止程序

killall 還允許您根據其組 ID 終止程序。您可以使用 -g 選項指定組 ID。例如,要終止組 1234 中的所有程序,您將執行 -

$ killall -g 1234

將 kill、pkill 和 killall 與訊號選項一起使用

到目前為止,我們只討論瞭如何使用這些命令使用預設訊號(SIGTERM 或 15)終止程序。但是,還有其他訊號可用於終止程序。需要注意的是,某些訊號可能會導致程序在終止之前執行特定操作,例如儲存資料或清理資源。以下是一些可與 kill、pkill 和 killall 一起使用的訊號選項示例 -

  • SIGKILL (9) - 這是最激進的訊號,它將立即終止程序,而不會允許它執行任何清理操作。在程序無響應且需要立即終止的情況下,它很有用。

  • SIGHUP (1) - 此訊號通常用於指示程序重新載入其配置檔案。某些程序在收到此訊號時也會終止。

  • SIGINT (2) - 當用戶按下 Ctrl-C 時,此訊號通常會發送到程序。它指示程序優雅地終止。

  • SIGQUIT (3) - 此訊號類似於 SIGINT,但它還會生成程序記憶體的 core dump 以用於除錯目的。

您可以透過將它們的訊號編號指定為 kill、pkill 或 killall 的選項來使用這些訊號。例如,要使用 SIGKILL 訊號終止程序,您將執行 -

$ kill -9 <PID>

根據程序狀態終止程序

除了根據程序的名稱、使用者或組終止程序外,您還可以使用 killall 根據其狀態終止程序。-s 選項允許您指定要終止的程序的狀態。例如,要終止所有停止的程序,您將執行 -

$ killall -s STOPPED

類似地,您可以使用 -s 選項和 RUNNING 狀態終止所有正在執行的程序 -

$ killall -s RUNNING

延遲終止程序

有時,在終止程序之前讓它有機會執行一些清理操作會很有用。例如,您可能希望允許程序儲存其當前狀態或在終止之前釋放一些資源。您可以將 kill 命令與 -s 選項一起使用,以便在指定的延遲後向程序傳送訊號。語法如下 -

$ kill -s <SIGNAL> -<SECONDS> <PID>

例如,要向程序傳送 SIGTERM 訊號並延遲 10 秒,您將執行 -

$ kill -s TERM -10 <PID>

這將給程序 10 秒的時間進行清理,然後它將被終止。

結論

在本文中,我們探討了三種用於在 Unix 系統上終止程序的命令列實用程式:kill、pkill 和 killall。我們介紹了它們的用法、常見選項以及如何在 Unix 系統上使用它們來管理程序的示例。通過了解如何使用這些實用程式,您可以更好地控制系統並更有效地處理無響應的程序。在終止程序時務必謹慎,因為操作不當會導致資料丟失或系統不穩定。與往常一樣,建議備份重要資料,並在不確定終止特定程序的後果時諮詢官方文件或尋求專家建議。

更新於:2023-03-23

3K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

立即開始
廣告
© . All rights reserved.