• 跳至主要導覽
  • 跳至主要內容
  • 跳至主要資訊欄
Office 指南

Office 指南

辦公室工作實用教學

  • Excel
  • Word
  • PowerPoint
  • Windows
  • PowerShell
  • R

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

介紹如何在 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

參考資料

  • George Ornbo:Linux and Unix kill command tutorial with examples
  • StackExchange:Kill all processes that are running for more than 5 minutes by a given user in linux bash script

分類:Linux

讀者互動方式

發佈留言 取消回覆

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

主要資訊欄

搜尋

近期文章

  • C++ 語言使用 Crypto++ 實作 RSA 數位簽章教學與範例
  • C++ 語言使用 Crypto++ 實作 RSA-OAEP 搭配 SHA256 加密教學與範例
  • C++ 語言使用 Crypto++ 實作 AES 加密、解密、認證加密教學與範例
  • C++ 語言使用 Crypto++ 實作 MD5、SHA1、SHA2、BLAKE2 雜湊教學與範例
  • Ubuntu Linux 安裝、使用 Crypto++ 加密函式庫教學與範例
  • C 語言使用 OpenSSL 實作橢圓曲線 ECDH 金鑰交換教學與範例
  • Python 以 eciespy 實作 ECC 非對稱式加密方法教學與範例
  • C 語言使用 OpenSSL 實作 PBKDF2 教學與範例

推薦網站

  • Udemy 線上教學課程
  • Coursera 線上教學課程

關注本站

  • 電子郵件
  • Facebook

公益

  • 家扶基金會
  • 台灣世界展望會
  • Yahoo 奇摩公益
  • igiving 公益網
  • 兒福聯盟

Copyright © 2021 · Office Guide