pkill 與 killall:批次終止程序 文章首圖

pkill 與 killall:批次終止程序

pkill 與 killall:批次終止程序

在 Linux 系統管理或日常開發中,我們經常需要終止某個程序。對於單一進程,kill 指令搭配 PID 是最直接的方式。然而,當面對多個同名進程、或需要根據程序名稱而非 PID 來進行批次管理時,手動查詢並逐一殺除不僅效率低落,也極易出錯。這時,pkillkillall 這兩個強大的指令就派上用場了。它們允許我們根據程序名稱、使用者或其他屬性來進行批次終止操作,大幅提升系統維護的效率。

本章節將深入解析這兩個指令的差異、常用選項以及實際應用場景,幫助你更精準地控制 Linux 系統資源。

核心概念與差異

雖然 pkillkillall 的目的都是終止程序,但它們的實作邏輯略有不同:

  • 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. 如何確認程序名稱?

在使用 pkillkillall 前,建議先使用 pspgrep 確認目標程序的名稱與數量,避免誤殺。

# 使用 pgrep 查看符合條件的程序 PID,而不實際終止
pgrep -a nginx

2. pkill 與 killall 的優先級與安全性

由於 pkill 採用部分比對,風險較高。例如,執行 pkill java 可能會意外終止掉 JVM 之外的其他相關程序。建議在生產環境中,優先使用 killall 進行精確控制,或使用 pkill -f 搭配更完整的參數來降低風險。此外,始終建議使用 sudo 執行,除非你只打算終止自己的程序。

小結

pkillkillall 是 Linux 系統管理中不可或缺的工具。pkill 勝在彈性,適合用於篩選特定使用者或複雜條件的程序;而 killall 勝在精確,適合用於終止特定服務。掌握這兩者的差異與選項,能幫助你在面對系統異常或資源爭奪時,迅速且安全地恢復系統穩定。下次當你需要清理一堆背景程序時,不妨試試看這些指令,讓你的工作流更加順暢。