介紹如何在 Linux 系統下使用 kill
、pkill
或 killall
等指令停止正在執行中的程式。
查詢執行中的程式
若要查詢系統上目前正在執行的程式,可以使用 ps
指令:
# 列出系統上所有行程的執行者、PID 與執行指令
ps axo user,pid,args
colord 1526 /usr/lib/colord/colord gdm 1569 /usr/lib/ibus/ibus-engine-simple root 14544 nginx: master process /usr/sbin/nginx -g daemon on; master_process on; www-data 14549 nginx: worker process www-data 14550 nginx: worker process root 17924 /usr/sbin/cupsd -l root 17925 /usr/sbin/cups-browsed root 19287 /usr/bin/containerd root 19461 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock [略]
在尋找並確認要終止的程式時,最重要的就是找出程式的行程 ID(PID),所以這裡我們只讓 ps
指令列出每個程式的執行者(user
)、PID(pid
)以及執行的指令(args
)。
通常我們都會搭配 grep
篩選出我們所需要的行程資訊,例如尋找 mutt
這個程式的行程資訊:
# 搭配 grep 篩選出 mutt 的行程資訊
ps axo user,pid,comm | grep mutt
ubuntu 23459 mutt
除了 ps
之外,也可以使用 pgrep
來查詢程式的 PID,例如查詢使用者為 ubuntu
、且指令中含有 mutt
關鍵字的行程 PID:
# 查詢使用者為 ubuntu、指令含有關鍵字 mutt 的行程 PID pgrep -u ubuntu mutt
23459
kill
終止程式執行
若要終止程式的執行,只要先確認好程式的 PID,就可以使用 kill
指令強制停止該程式。例如上面查到 mutt
這個程式的 PID 是 23459
,所以若要讓該程式終止執行,就可以執行:
# 停止 PID 為 23459 的程式 kill 23459
kill
預設會以正常的程序通知程式停止執行,但若該程式沒有反應,仍然繼續執行的話,就可以加上 -9
參數,改用強硬的方式立刻強制停止:
# 立刻強制停止 PID 為 23459 的程式 kill -9 23459
pkill
終止程式執行
除了先查詢好程式的 PID,再以 kill
終止程式的執行之外,亦可採用 pkill
來依照程式名稱與其他資訊來終止指定的程式。
# 終止指令含有關鍵字 mutt 的行程 pkill mutt # 終止使用者為 ubuntu、指令含有關鍵字 mutt 的行程 pkill -u ubuntu mutt
pkill
的參數用法跟 pgrep
相同,只是 pkill
會直接終止找到的行程。
pkill
也可以強制停止程式:
# 強制停止指令含有關鍵字 mutt 的行程 pkill -KILL mutt
killall
終止程式執行
killall
的作用跟 pkill
類似,也是可以根據指令名稱來終止程式:
# 停止所有 mutt 指令的行程 killall mutt # 強制停止所有 mutt 指令的行程 killall -KILL mutt
killall
與 pkill
之間比較明顯的差異在於 killall
在比對程式名稱時要完全符合,而 pkill
則是包含關鍵字即可。
終止執行太久的程式
如果要找出系統上執行太久的程式,可以使用以下指令稿:
# 列出使用者為 ubuntu、且執行時間超過 300 秒的程式 ps -axo user,pid,etimes,comm | awk '/^ubuntu/ {if ($3 > 300) {print $0}}'
ubuntu 22336 7794 systemd ubuntu 22337 7794 (sd-pam) ubuntu 22457 7794 sshd ubuntu 22458 7794 bash ubuntu 22807 6872 sshd ubuntu 22808 6872 bash ubuntu 25062 408 mutt ubuntu 25188 391 sshd ubuntu 25189 391 bash ubuntu 25201 389 python3
找出執行過久的程式之後,就可以用對應的 PID 來終止程式的執行。
如果想要自動化終止所有執行太久的程式,可以直接以 awk
產生 kill
的指令:
# 對使用者為 ubuntu、且執行時間超過 300 秒的程式 # 產生終止程式的指令 ps -axo user,pid,etimes,comm |\ awk '/^ubuntu/ {if ($3 > 300) {print "kill "$2" # "$4}}'
kill 22336 # systemd kill 22337 # (sd-pam) kill 22457 # sshd kill 22458 # bash kill 22807 # sshd kill 22808 # bash kill 25062 # mutt kill 25188 # sshd kill 25189 # bash kill 25201 # python3
確認無誤之後,將這些 kill
指令導向 sh
執行:
# 對使用者為 ubuntu、且執行時間超過 300 秒的程式 # 產生終止程式的指令,並自動執行 ps -axo user,pid,etimes,comm |\ awk '/^ubuntu/ {if ($3 > 300) {print "kill "$2" # "$4}}' |\ sh