1. 結束進程
今天我們要更進一步,掌握幾個可以高效結束進程的命令。準備好吧,對於那些「卡死」的程序,你的耐心很快就要到頭了!
在 Linux 中,每個運行的應用程序或命令都是一個進程。但是,如果程序卡住了,使用了 100% 的 CPU 資源,或者只是突然不正常地工作了該怎麼辦?作為管理員(或者開發者)的任務就是介入並結束這些「叛亂」的進程。在 Linux 中有一整套工具可以做到這點:kill、killall 和 pkill。別擔心,雖然名字聽起來很嚇人,但我們不是來砸場子的,而是要優雅地讓系統恢復正常。
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。熟悉的指令 ps、top 或 htop 可以幫助你。例如,指令 ps aux 的輸出將顯示所有正在執行的進程:
ps aux | grep firefox
這個查詢會找到 Firefox 進程並顯示它的 PID。
進程結束了,終於可以喘口氣了。但如果有多個「掛住」的進程該怎麼辦?這時候就輪到 killall 和 pkill 上場了。
3. 指令 killall
方便的批量結束
killall 指令可以結束所有具有特定名稱的進程。你不需要手動查找PID,整個過程更加簡單。舉個例子,如果你想關閉所有正在運行的Firefox實例:
killall firefox
正如 kill 指令一樣,killall 會向進程發送信號。你可以指定特定的信號:
killall -9 firefox
有用的小提示
使用像 killall 這樣的指令時請小心。如果你意外地指定了一個過於普遍的進程名稱,例如 killall python,你可能會結束所有正在執行的Python應用,包括伺服器任務或重要腳本。
支援哪些信號?
對於所有指令 kill、killall 和 pkill,可以通過以下指令查看可用的信號列表:
kill -l
4. 命令 pkill
通過名稱(或部分名稱)查找進程
命令 pkill 的操作類似於 killall,但更靈活。它允許結束與特定模式匹配的進程。例如:
pkill fire
該命令將結束名稱中包含"fire"的所有進程。這在名稱較長或僅知道部分名稱的情況下非常方便。
結束使用者的進程
你可以結束屬於特定使用者的進程。例如:
pkill -u username
這將結束屬於使用者 username 的所有進程。
kill、killall 和 pkill 的比較
| 命令 | 特點 |
|---|---|
kill |
通過 PID 結束進程。精確操作。 |
killall |
結束具有指定名稱的所有進程。適合批量終止。 |
pkill |
通過名稱或模式結束進程。支持其他參數,例如使用者名稱。 |
5. 實踐:結束進程
讓我們實際操作一下我們學到的內容。首先,啟動一些長時間運行的進程:
sleep 300 &
sleep 400 &
sleep 500 &
這些命令將創建三個不同等待時間的背景進程。現在你可以使用命令 kill,killall 和 pkill 進行操作。
- 用命令
ps查看所有運行的sleep進程:
ps aux | grep sleep
你會看到每個進程的 PID。
- 結束 PID 為例如 1234 的進程:
kill 1234
- 一次性結束所有
sleep進程:
killall sleep
- 再次啟動一些
sleep進程並用pkill結束它們:
pkill sl
6. 常見錯誤和重要細節
如果你試圖結束一個你沒有權限操作的進程(例如,其他用戶的進程),指令會報錯。為此,你需要擁有超級用戶的權限(sudo)。例如:
sudo kill 1234
另一個可能導致困惑的地方是過於激進地使用信號 -9。這相當於直接拔掉電腦的電源:系統可能無法釋放資源或保存數據。僅在必要時使用SIGKILL。
操作killall和pkill時要小心,尤其是在管理伺服器時。盲目結束進程可能導致重要數據的丟失。
為什麼需要了解結束進程的指令?
這些指令應用廣泛,從終止卡死的應用程序到管理伺服器進程。在面試中,了解kill和pkill可能會成為評估你能力的重要指標,特別是在系統管理或後端開發相關工作中。
利用這些知識可以創建腳本,自動結束無法控制的進程或釋放被佔用的端口。例如,在啟動占用8080端口的伺服器之前,可以使用:
pkill -f "port 8080"
這些指令的靈活性和實用性使它們成為每位Linux專家的必備工具。
GO TO FULL VERSION