Categories: Linux

Linux 停止程式執行 kill、pkill 與 killall 指令教學與範例

介紹如何在 Linux 系統下使用 killpkillkillall 等指令停止正在執行中的程式。

查詢執行中的程式

若要查詢系統上目前正在執行的程式,可以使用 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

killallpkill 之間比較明顯的差異在於 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

參考資料

Share
Published by
Office Guide

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

9 個月 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

9 個月 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

9 個月 ago

Windows 使用 TPM 虛擬智慧卡保護 SSH 金鑰教學與範例

本篇介紹如何在 Windows...

10 個月 ago

Linux 以 Shamir’s Secret Sharing 分割保存金鑰教學與範例

介紹如何在 Linux 中使用...

10 個月 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

10 個月 ago