killall 指令:依名稱結束行程、-9 訊號與安裝 psmisc
killall 指令是以程式名稱而非行程編號(PID)挑選執行中的行程並送出訊號的 Linux 指令,不指定訊號時會送出 SIGTERM(依官方手冊)。由於它會一次結束所有同名行程,我們先在 AlmaLinux 9 伺服器上用 pgrep 和 ps 確認以其他名稱複製 sleep 後啟動的四個行程;名稱超過 15 個字元的執行檔,行程名稱只留下前 15 個字元。
killall 只在 Debian 12 伺服器上以一般帳號為測試啟動的 xxsleep 行程上執行。結果框是在 AlmaLinux 9.8 伺服器以 root 帳號執行的 rpm、pgrep、ps、pidof、cat、kill 輸出,以及在 Debian 12 伺服器執行的 killall 輸出。行程編號(PID)、行程名稱、執行檔路徑和帳號名稱已換成範例值。
1️⃣ 安裝 killall 指令
killall 包含在 psmisc 套件中。在 AlmaLinux 9.8 伺服器上用 rpm 確認 /usr/bin/killall 所屬的套件,顯示的版本是 psmisc 23.4。
rpm -qf --qf '%{NAME} %{VERSION}\n' /usr/bin/killallpsmisc 23.4用 rpm -ql 查看同一套件的檔案清單,其中也有 pstree 和 fuser。
若出現表示找不到指令的 [command not found],請安裝 psmisc 套件。RHEL 系列為 [dnf install psmisc],Debian 系列為 [apt install psmisc]。Debian 12 伺服器已安裝 psmisc 23.6,killall 位於 /usr/bin/killall。
在 AlmaLinux 9.8 伺服器上確認時,名稱相近的 pkill 屬於 procps-ng 套件,kill 則是 shell 內建指令。
2️⃣ killall 指令用法
基本形式是 [killall 行程名稱]。它會找出以所寫名稱執行中的所有行程並送出訊號;寫入多個名稱時,會對每個名稱做相同的事(依官方手冊)。
由於同名的行程會一次全部結束,請先用 pgrep 確認該名稱下有哪些行程在執行。我們把 sleep 以 xxsleep-a1、xxsleep-a2、xxsleep-longname-x1 的名稱複製到工作資料夾,並將 xxsleep-a1 啟動兩次,共執行四個行程,再用 -l 輸出編號和名稱。
pgrep -l xxsleep2141 xxsleep-a1
2142 xxsleep-a1
2150 xxsleep-a2
2155 xxsleep-longnam第四行的執行檔名稱是 xxsleep-longname-x1,但行程名稱在 xxsleep-longnam 處被截斷。
加上 -a 會顯示執行時的完整命令列。兩個同名的 xxsleep-a1 以結尾的秒數引數 300 和 310 區分。
pgrep -a xxsleep2141 /root/work/xxsleep-a1 300
2142 /root/work/xxsleep-a1 310
2150 /root/work/xxsleep-a2 320
2155 /root/work/xxsleep-longname-x1 330只找名稱完全相同的行程時,請加上 -x。以 xxsleep-a1 查詢的結果是兩個編號。
pgrep -x xxsleep-a12141
2142直接輸入一個名稱、只確認編號時,請使用 pidof。查詢 xxsleep-a1 時,兩個編號顯示在同一行。
pidof xxsleep-a12142 2141ps 在 -C 後面以逗號寫入多個名稱時,只輸出名稱完全相同的行程。
ps -o pid,comm -C xxsleep-a1,xxsleep-a2 PID COMMAND
2141 xxsleep-a1
2142 xxsleep-a1
2150 xxsleep-a2在 Debian 12 伺服器上以相同名稱啟動四個行程並執行 [killall xxsleep-a1] 後,沒有任何輸出,並以結束碼 0 結束。再用 pgrep 查詢,兩個 xxsleep-a1 已消失,只剩下 xxsleep-a2 和 xxsleep-longname-x1。若寫入含有斜線(/)的路徑而非名稱,會不論名稱挑選執行該檔案的行程(依官方手冊)。
寫入不存在的名稱 xxsleep-zz 時,出現名稱後面接著 [no process found] 的一行,並以結束碼 1 結束。只有在每個寫入的名稱都至少結束一個行程時,結束碼才是 0(依官方手冊)。
killall xxsleep-zzxxsleep-zz: no process found只想結束一個已知編號的行程時,請用 Linux kill 指令只對該編號送出訊號。
3️⃣ killall 指令選項
從 /proc/PID/comm 讀取以 xxsleep-longname-x1 啟動的行程名稱時,只留下前 15 個字元 xxsleep-longnam。
cat /proc/2155/commxxsleep-longnam我們以 16 個字元的 xxsleep-longname 執行 pgrep。
pgrep -a xxsleep-longname沒有輸出並以結束碼 1 結束;改用 15 個字元的 xxsleep-longnam 再查詢時,就出現了該行程。
pgrep -l xxsleep-longnam2155 xxsleep-longnamkillall 收到超過 15 個字元的名稱時,若有無法讀取完整名稱的行程,會把前 15 個字元相符的全部當成對象,加上 -e 則略過這類項目(依官方手冊)。在 Debian 12 伺服器上加上 -e 和 -v 寫入前 15 個字元 xxsleep-longnam 時,出現略過其他三個名稱在 15 個字元處被截斷之行程的行,最後以 [no process found] 結束。
killall -e -v xxsleep-longnamkillall: skipping partial match quota_events_un(37)
killall: skipping partial match acpi_thermal_pm(112)
killall: skipping partial match ext4-rsv-conver(246)
xxsleep-longnam: no process found寫入完整名稱 xxsleep-longname-x1 時,在相同的略過行之後,出現對該行程送出訊號的一行。
killall -e -v xxsleep-longname-x1killall: skipping partial match quota_events_un(37)
killall: skipping partial match acpi_thermal_pm(112)
killall: skipping partial match ext4-rsv-conver(246)
Killed xxsleep-longname-x1(2155) with signal 15加上 -v 後,每個收到訊號的行程都會出現一行,包含名稱、編號和訊號編號。
killall -v xxsleep-a2Killed xxsleep-a2(2150) with signal 15-i 會對每個行程詢問是否結束。我們再次啟動兩個 xxsleep-a1,並透過標準輸入依序送入 y 和 n,兩個提問接連顯示在同一行,只有第一個 xxsleep-a1 結束,第二個仍留著。
printf 'y\nn\n' | killall -i xxsleep-a1Kill xxsleep-a1(2171) ? (y/N) Kill xxsleep-a1(2172) ? (y/N)-u 只挑選該帳號擁有的行程,省略名稱時則以該帳號的全部行程為對象。在帳號名稱後面一併寫入 xxsleep-a1 時,只對剩下的 xxsleep-a1 送出訊號。
killall -v -u user xxsleep-a1Killed xxsleep-a1(2172) with signal 15-o 和 -y 依啟動時間挑選,時間像 [-o 30m] 這樣在數字後面加上 s、m、h、d、w、M、y 單位。
-r 會把名稱當作延伸正規表示式讀取。把 ^xxsleep-a 樣式交給 pgrep 時,出現了三個以 xxsleep-a 開頭的行程。
pgrep -l '^xxsleep-a'2141 xxsleep-a1
2142 xxsleep-a1
2150 xxsleep-a2-w 會每秒確認一次,等到收到訊號的行程全部消失。若行程忽略訊號或停留在殭屍狀態,就可能無止盡地等待。
下方第一個表是本文實際執行的確認指令和 killall 選項,未執行的 killall 選項則依官方手冊整理在第二個表。
📌 確認行程與 killall:本文執行結果
| 指令 | 作用 | 本文看到的結果 | |
|---|---|---|---|
| pgrep -l 名稱 | 名稱中含有該字串的行程編號和名稱 | xxsleep 出現四行,長名稱只顯示到前 15 個字元 xxsleep-longnam | |
| pgrep -a 名稱 | 編號和完整命令列 | 以結尾引數 300 和 310 區分兩個同名的 xxsleep-a1 | |
| pgrep -x 名稱 | 只顯示名稱完全相同的行程編號 | xxsleep-a1 得到 2141 和 2142 兩行 | |
| pidof 名稱 | 以該名稱執行中的編號,顯示在同一行 | xxsleep-a1 得到 2142 2141 | |
| ps -o pid,comm -C 名稱 | 名稱完全相同的行程編號和名稱,可用逗號寫入多個名稱 | xxsleep-a1 兩行和 xxsleep-a2 一行 | |
| cat /proc/PID/comm | 行程名稱(最多前 15 個字元) | 2155 是 xxsleep-longnam | |
| killall 名稱 | 對該名稱的行程送出 SIGTERM | 兩個 xxsleep-a1 結束,結束碼 0;不存在的名稱 xxsleep-zz 為 no process found 與結束碼 1 | |
| killall -e 名稱 | 超過 15 個字元的名稱只在完整名稱相符時 | xxsleep-longnam 為 no process found,xxsleep-longname-x1 結束 | |
| killall -v 名稱 | 對每個送出訊號的行程輸出結果 | Killed xxsleep-a2(2150) with signal 15 | |
| killall -i 名稱 | 結束前逐一確認每個行程 | 輸入 y 和 n 後只有第一個 xxsleep-a1 結束 | |
| killall -u 帳號名稱 | 只限該帳號擁有的行程 | 與名稱一併寫入時,只有該帳號的 xxsleep-a1 結束 | |
| killall -9 名稱 | 以 SIGKILL 取代 SIGTERM | Killed xxsleep-a2(2173) with signal 9 |
📎 其他選項:依官方手冊
| 選項 | 作用 | |
|---|---|---|
| -I, --ignore-case | 比對名稱時不分大小寫 | |
| -g, --process-group | 對行程所屬的行程群組送出訊號(每個群組一次) | |
| -l, --list | 已知訊號名稱清單 | |
| -n, --ns PID | 只限與該 PID 相同 PID 命名空間的行程,預設為所有命名空間 | |
| -o, --older-than 時間 | 只限比該時間更早啟動的行程(單位 s、m、h、d、w、M、y) | |
| -q, --quiet | 即使沒有結束任何行程也不提示 | |
| -r, --regexp | 把名稱當作延伸正規表示式讀取 | |
| -s, --signal 訊號 | 取代 SIGTERM 送出的訊號 | |
| -V, --version | 輸出版本資訊 | |
| -w, --wait | 等到收到訊號的行程全部消失 | |
| -y, --younger-than 時間 | 只限比該時間更晚啟動的行程 | |
| -Z, --context 樣式 | 只限安全性內容符合延伸正規表示式樣式的行程,須寫在其他引數之前,可省略名稱 |
🔲 killall 指令模擬器
下方模擬器以四個 xxsleep 行程加上範例帳號 user1 的 xxsleep-a2 組成的清單開始。點按晶片即可比較 [killall -v]、[-i]、[-u] 會讓清單中哪些行消失;killall 的輸出文字是依 Debian 12 伺服器上執行的輸出所做的模仿。
4️⃣ killall 訊號
要送出的訊號可用名稱寫成 [-HUP] 或 [-SIGHUP],用編號寫成 [-1],或寫在 -s 選項後面(依官方手冊)。[killall -9 行程名稱] 會送出 9 號訊號 SIGKILL。SIGKILL 是行程無法攔截也無法忽略的訊號(依官方手冊),因此行程會在無法做收尾工作的情況下結束。所以要在預設訊號 SIGTERM 無法結束行程時才送出。
在 Debian 12 伺服器上對重新啟動的 xxsleep-a2 同時加上 -v 和 -9,出現了印有訊號編號 9 的一行。
killall -9 -v xxsleep-a2Killed xxsleep-a2(2173) with signal 9我們用 [kill -l] 確認了訊號名稱和編號。killall 也有輸出已知訊號名稱的 -l 選項。
kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX輸入一個編號時,只會顯示該訊號的名稱。killall 預設送出的 15 是 TERM,用 -9 送出的 9 是 KILL。
kill -l 15TERMkill -l 9KILL寫入清單中沒有的訊號名稱時,會出現 [FOO: unknown signal; killall -l lists signals.] 形式的訊息(依官方手冊與程式文字)。
🔢 FAQ & 推薦內容
ℹ️ 聯盟行銷說明
本站內容包含聯盟行銷連結。訪客透過這些連結購買商品或服務時,本站會從賣家獲得佣金。在這個過程中,購買者支付的金額(遇到活動折扣時金額會降低↓)並不會因此提高。刊登的價格、折扣與庫存資訊以撰寫當時為準,可能與實際情況不同,購買前請向賣家做最後確認。商品的挑選與評價依本站自訂的標準撰寫,是否支付佣金不會影響介紹順序或評價內容。