killall 指令:依名稱結束行程、-9 訊號與安裝 psmisc

測試環境RHEL 系列AlmaLinux 9.8psmisc 23.4root 帳號Debian 12 · psmisc 23.6 一般帳號(執行 killall)
程序 · 工作排程指令killall位置/usr/bin/killall2026-11-03 確認

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 指令

  • ↪️ psmisc 套件與版本確認

killall 包含在 psmisc 套件中。在 AlmaLinux 9.8 伺服器上用 rpm 確認 /usr/bin/killall 所屬的套件,顯示的版本是 psmisc 23.4。

rpm -qf --qf '%{NAME} %{VERSION}\n' /usr/bin/killall
psmisc 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 xxsleep
2141 xxsleep-a1
2142 xxsleep-a1
2150 xxsleep-a2
2155 xxsleep-longnam

第四行的執行檔名稱是 xxsleep-longname-x1,但行程名稱在 xxsleep-longnam 處被截斷。

加上 -a 會顯示執行時的完整命令列。兩個同名的 xxsleep-a1 以結尾的秒數引數 300 和 310 區分。

pgrep -a xxsleep
2141 /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-a1
2141
2142

直接輸入一個名稱、只確認編號時,請使用 pidof。查詢 xxsleep-a1 時,兩個編號顯示在同一行。

pidof xxsleep-a1
2142 2141

ps 在 -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-zz
xxsleep-zz: no process found

只想結束一個已知編號的行程時,請用 Linux kill 指令只對該編號送出訊號。

3️⃣ killall 指令選項

  • ↪️ -e 與 15 字元名稱、-i、-v、-u、-r

從 /proc/PID/comm 讀取以 xxsleep-longname-x1 啟動的行程名稱時,只留下前 15 個字元 xxsleep-longnam。

cat /proc/2155/comm
xxsleep-longnam

我們以 16 個字元的 xxsleep-longname 執行 pgrep。

pgrep -a xxsleep-longname

沒有輸出並以結束碼 1 結束;改用 15 個字元的 xxsleep-longnam 再查詢時,就出現了該行程。

pgrep -l xxsleep-longnam
2155 xxsleep-longnam

killall 收到超過 15 個字元的名稱時,若有無法讀取完整名稱的行程,會把前 15 個字元相符的全部當成對象,加上 -e 則略過這類項目(依官方手冊)。在 Debian 12 伺服器上加上 -e 和 -v 寫入前 15 個字元 xxsleep-longnam 時,出現略過其他三個名稱在 15 個字元處被截斷之行程的行,最後以 [no process found] 結束。

killall -e -v xxsleep-longnam
killall: 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-x1
killall: 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-a2
Killed xxsleep-a2(2150) with signal 15

-i 會對每個行程詢問是否結束。我們再次啟動兩個 xxsleep-a1,並透過標準輸入依序送入 y 和 n,兩個提問接連顯示在同一行,只有第一個 xxsleep-a1 結束,第二個仍留著。

printf 'y\nn\n' | killall -i xxsleep-a1
Kill xxsleep-a1(2171) ? (y/N) Kill xxsleep-a1(2172) ? (y/N)

-u 只挑選該帳號擁有的行程,省略名稱時則以該帳號的全部行程為對象。在帳號名稱後面一併寫入 xxsleep-a1 時,只對剩下的 xxsleep-a1 送出訊號。

killall -v -u user xxsleep-a1
Killed 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 取代 SIGTERMKilled 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 伺服器上執行的輸出所做的模仿。

killall 指令模擬器psmisc 23.4
[root@server work]#
只在瀏覽器內運作。左側清單為範例值,killall 是依 Debian 12 伺服器上執行的輸出文字所做的模仿,只會從清單中刪除。

4️⃣ killall 訊號

  • ↪️ -s 選項與 killall -9、訊號編號

要送出的訊號可用名稱寫成 [-HUP] 或 [-SIGHUP],用編號寫成 [-1],或寫在 -s 選項後面(依官方手冊)。[killall -9 行程名稱] 會送出 9 號訊號 SIGKILL。SIGKILL 是行程無法攔截也無法忽略的訊號(依官方手冊),因此行程會在無法做收尾工作的情況下結束。所以要在預設訊號 SIGTERM 無法結束行程時才送出。

在 Debian 12 伺服器上對重新啟動的 xxsleep-a2 同時加上 -v 和 -9,出現了印有訊號編號 9 的一行。

killall -9 -v xxsleep-a2
Killed 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 15
TERM
kill -l 9
KILL

寫入清單中沒有的訊號名稱時,會出現 [FOO: unknown signal; killall -l lists signals.] 形式的訊息(依官方手冊與程式文字)。

🔢 FAQ & 推薦內容

killall 是 psmisc 套件的指令,pkill 則是與 pgrep 相同的 procps-ng 套件的指令。pkill 會像 pgrep 一樣以延伸正規表示式尋找名稱的一部分,killall 則只有加上 -r 時才把名稱當作正規表示式讀取(依官方手冊)。

psmisc 官方手冊寫道,在非 Linux 的系統上 [killall 名稱] 可能出現與預期不同的行為,以管理員帳號執行時尤其要小心。在其他系統上,請先查閱該系統的手冊。

一次可寫入的名稱數量有上限,為 unsigned long 整數大小乘以 8 的值。64 位元系統通常是 64 個,32 位元系統是 32 個(依官方手冊)。

ℹ️ 聯盟行銷說明
本站內容包含聯盟行銷連結。訪客透過這些連結購買商品或服務時,本站會從賣家獲得佣金。在這個過程中,購買者支付的金額(遇到活動折扣時金額會降低↓)並不會因此提高。刊登的價格、折扣與庫存資訊以撰寫當時為準,可能與實際情況不同,購買前請向賣家做最後確認。商品的挑選與評價依本站自訂的標準撰寫,是否支付佣金不會影響介紹順序或評價內容。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Prove your humanity: 10   +   7   =