CodeGym /課程 /Docker SELF /進程結束:命令 `kill`、`killall`、`pkill`

進程結束:命令 `kill`、`killall`、`pkill`

Docker SELF
等級 2 , 課堂 5
開放

1. 結束進程

今天我們要更進一步,掌握幾個可以高效結束進程的命令。準備好吧,對於那些「卡死」的程序,你的耐心很快就要到頭了!

在 Linux 中,每個運行的應用程序或命令都是一個進程。但是,如果程序卡住了,使用了 100% 的 CPU 資源,或者只是突然不正常地工作了該怎麼辦?作為管理員(或者開發者)的任務就是介入並結束這些「叛亂」的進程。在 Linux 中有一整套工具可以做到這點:killkillallpkill。別擔心,雖然名字聽起來很嚇人,但我們不是來砸場子的,而是要優雅地讓系統恢復正常。


2. 指令 kill

基礎知識

kill 指令依據進程的識別碼 (PID) 來結束進程。PID 是系統指派給每個進程的唯一編號。例如,如果你想要結束 PID 為 1234 的進程,可以使用以下指令:

kill 1234

Linux 天生就很民主,所以 kill 指令並不是直接命令進程「去死」,而是向它發出結束請求。這個請求被稱為「訊號」。預設情況下,kill 發送的是 SIGTERM (15) 訊號。

什麼是訊號?

Linux 使用訊號來與進程通信。就像寄出不同意圖的明信片:

  • SIGTERM (15): "請結束吧!" 這是一個有禮貌的請求,讓進程結束執行。
  • SIGKILL (9): "夠了,掰掰!" 強制結束進程。
  • SIGHUP (1): "嘿,重載一下配置!" 用於重新啟動某些進程而不停止它們。

強制結束進程的範例:

kill -9 1234

如果進程無法響應 SIGTERM,你可以發送更嚴厲的訊號 — SIGKILL

如何取得進程的 PID?

要使用 kill 指令,你需要知道進程的 PID。熟悉的指令 pstophtop 可以幫助你。例如,指令 ps aux 的輸出將顯示所有正在執行的進程:

ps aux | grep firefox

這個查詢會找到 Firefox 進程並顯示它的 PID。

進程結束了,終於可以喘口氣了。但如果有多個「掛住」的進程該怎麼辦?這時候就輪到 killallpkill 上場了。


3. 指令 killall

方便的批量結束

killall 指令可以結束所有具有特定名稱的進程。你不需要手動查找PID,整個過程更加簡單。舉個例子,如果你想關閉所有正在運行的Firefox實例:

killall firefox

正如 kill 指令一樣,killall 會向進程發送信號。你可以指定特定的信號:

killall -9 firefox

有用的小提示

使用像 killall 這樣的指令時請小心。如果你意外地指定了一個過於普遍的進程名稱,例如 killall python,你可能會結束所有正在執行的Python應用,包括伺服器任務或重要腳本。

支援哪些信號?

對於所有指令 killkillallpkill,可以通過以下指令查看可用的信號列表:

kill -l

4. 命令 pkill

通過名稱(或部分名稱)查找進程

命令 pkill 的操作類似於 killall,但更靈活。它允許結束與特定模式匹配的進程。例如:

pkill fire

該命令將結束名稱中包含"fire"的所有進程。這在名稱較長或僅知道部分名稱的情況下非常方便。

結束使用者的進程

你可以結束屬於特定使用者的進程。例如:

pkill -u username

這將結束屬於使用者 username 的所有進程。

killkillallpkill 的比較

命令 特點
kill 通過 PID 結束進程。精確操作。
killall 結束具有指定名稱的所有進程。適合批量終止。
pkill 通過名稱或模式結束進程。支持其他參數,例如使用者名稱。

5. 實踐:結束進程

讓我們實際操作一下我們學到的內容。首先,啟動一些長時間運行的進程:

sleep 300 &
sleep 400 &
sleep 500 &

這些命令將創建三個不同等待時間的背景進程。現在你可以使用命令 killkillallpkill 進行操作。

  1. 用命令 ps 查看所有運行的 sleep 進程:
ps aux | grep sleep

你會看到每個進程的 PID。

  1. 結束 PID 為例如 1234 的進程:
kill 1234
  1. 一次性結束所有 sleep 進程:
killall sleep
  1. 再次啟動一些 sleep 進程並用 pkill 結束它們:
pkill sl

6. 常見錯誤和重要細節

如果你試圖結束一個你沒有權限操作的進程(例如,其他用戶的進程),指令會報錯。為此,你需要擁有超級用戶的權限(sudo)。例如:

sudo kill 1234

另一個可能導致困惑的地方是過於激進地使用信號 -9。這相當於直接拔掉電腦的電源:系統可能無法釋放資源或保存數據。僅在必要時使用SIGKILL

操作killallpkill時要小心,尤其是在管理伺服器時。盲目結束進程可能導致重要數據的丟失。


為什麼需要了解結束進程的指令?

這些指令應用廣泛,從終止卡死的應用程序到管理伺服器進程。在面試中,了解killpkill可能會成為評估你能力的重要指標,特別是在系統管理或後端開發相關工作中。

利用這些知識可以創建腳本,自動結束無法控制的進程或釋放被佔用的端口。例如,在啟動占用8080端口的伺服器之前,可以使用:

pkill -f "port 8080"

這些指令的靈活性和實用性使它們成為每位Linux專家的必備工具。

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION