pkill 與 killall:批次終止程序
在 Linux 系統管理或日常開發中,我們經常需要終止某個程序。對於單一進程,kill 指令搭配 PID 是最直接的方式。然而,當面對多個同名進程、或需要根據程序名稱而非 PID 來進行批次管理時,手動查詢並逐一殺除不僅效率低落,也極易出錯。這時,pkill 和 killall 這兩個強大的指令就派上用場了。它們允許我們根據程序名稱、使用者或其他屬性來進行批次終止操作,大幅提升系統維護的效率。
本章節將深入解析這兩個指令的差異、常用選項以及實際應用場景,幫助你更精準地控制 Linux 系統資源。
核心概念與差異
雖然 pkill 和 killall 的目的都是終止程序,但它們的實作邏輯略有不同:
- pkill:屬於
procps-ng套件的一部分。它透過比對程序名稱(process name)的部分字串來尋找符合條件的程序。這意味著如果你輸入pkill firefox,它會終止所有名稱中包含 "firefox" 字串的程序。 - killall:通常屬於
psmisc套件。它比對的是程序的完整名稱(exact match)。因此,killall firefox只會終止名稱完全等於 "firefox" 的程序,不會誤殺其他名稱包含該字串的程序。
pkill 指令詳解與範例
pkill 提供了豐富的選項,讓我們能更精確地篩選目標程序。在 Ubuntu 22.04 或 Debian 12 上,這些功能皆可直接使用。
基本用法與名稱比對
最簡單的用法是直接指定程序名稱。由於 pkill 進行的是部分字串比對,請務必謹慎使用,以免誤殺。
# 終止所有名稱中包含 "python" 的程序
sudo pkill python
依使用者終止程序
這是 pkill 最實用的功能之一。當某個使用者開啟了過多無用的程序佔用資源時,可以直接將其所有程序終止。
# 終止使用者 "alice" 的所有程序
sudo pkill -u alice
使用 -f 選項比對完整命令列
預設情況下,pkill 只比對程序名稱(即 /proc/[pid]/comm 中的內容)。如果程序名稱很短,但參數很長,可能會比對失敗。加上 -f 選項後,它會比對完整的命令列(command line)。
# 終止命令列中包含 "node server.js" 的程序
sudo pkill -f "node server.js"
發送特定訊號
預設 pkill 發送的是 SIGTERM(訊號 15),這允許程序進行清理工作後退出。若程序無反應,可強制發送 SIGKILL(訊號 9)。
# 強制終止所有名稱包含 "chrome" 的程序
sudo pkill -9 chrome
killall 指令詳解與範例
killall 的操作邏輯較為單純,強調精確性。
基本用法
# 終止所有名稱完全等於 "nginx" 的程序
sudo killall nginx
依時間終止程序
killall 提供了一個獨特的選項 -o (older-than),可以終止在指定時間之前啟動的程序。這對於清理舊版服務特別有用。
# 終止所有啟動時間超過 10 分鐘的程序
killall -o 10m process_name
忽略大小寫
預設 killall 是區分大小寫的。若你無法確定程序名稱的大小寫,可以使用 -I 選項。
# 不區分大小寫,終止名稱等於 "Chrome" 的程序
killall -I chrome
常見問題與注意事項
1. 如何確認程序名稱?
在使用 pkill 或 killall 前,建議先使用 ps 或 pgrep 確認目標程序的名稱與數量,避免誤殺。
# 使用 pgrep 查看符合條件的程序 PID,而不實際終止
pgrep -a nginx
2. pkill 與 killall 的優先級與安全性
由於 pkill 採用部分比對,風險較高。例如,執行 pkill java 可能會意外終止掉 JVM 之外的其他相關程序。建議在生產環境中,優先使用 killall 進行精確控制,或使用 pkill -f 搭配更完整的參數來降低風險。此外,始終建議使用 sudo 執行,除非你只打算終止自己的程序。
小結
pkill 和 killall 是 Linux 系統管理中不可或缺的工具。pkill 勝在彈性,適合用於篩選特定使用者或複雜條件的程序;而 killall 勝在精確,適合用於終止特定服務。掌握這兩者的差異與選項,能幫助你在面對系統異常或資源爭奪時,迅速且安全地恢復系統穩定。下次當你需要清理一堆背景程序時,不妨試試看這些指令,讓你的工作流更加順暢。