Linux 查詢正在執行的處理程序 (ps, pgrep)

指令 ps 是處理程序狀態(process status) 的簡寫,經常會搭配 aux 參數:
    
ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.0 168264 11484 ?        Ss    2023 429:24 /lib/systemd/systemd --system --deserialize 67
root           2  0.0  0.0      0     0 ?        S     2023   0:15 [kthreadd]
root           3  0.0  0.0      0     0 ?        I<    2023   0:00 [rcu_gp]
root           4  0.0  0.0      0     0 ?        I<    2023   0:00 [rcu_par_gp]
dev      1686981  0.0  0.1 182784 38248 ?        S    Feb05   0:03 php-fpm: pool www
systemd+ 3945823  0.0  0.0   8092   712 ?        S     2023   0:00 nginx: worker process
www-data 4061395  0.0  0.0  88400 19452 ?        S    Feb15   0:02 apache2 -DFOREGROUND
    

用途是查看 (a)系統所有 (x)包含未從終端機執行 (u)顯示附加資訊 的處理程序資訊。

查詢指定處理程序

想要確認某個處理程序有沒有在執行:
    
ps aux | grep 處理程序
    

假設要查詢 script.sh 這個腳本是否正在執行中:
    
ps aux | grep script.sh
dev       860269  0.0  0.0   2892   956 tty1     S+   Feb19   0:00 sh script.sh
dev      2593491  0.0  0.0   6612  2244 pts/0    S+   22:55   0:00 grep --color=auto script.sh
    

這裡可以發現有兩個和 script.sh 有關的處理程序,不過其實第二個是我們使用 grep 來過濾「 ps 指令查詢 script.sh 處理程序的輸出結果」的處理程序,為了要避免顯示 grep 的處理程序,可以使用下面的方式過濾掉:
    
ps aux | grep -v grep | grep 處理程序
    

太麻煩了吧...

pgrep

不過在 Linux 中有一個更簡單的指令 pgrep (process grep),就是專門用來過濾執行中的處理程序:
    
pgrep -af script.sh
860269 sh script.sh
    

(a)顯示 PID 和完整指令 (f)在完整的處理程序名稱中尋找

停止處理程序

現在我們找到處理程序了,假設要停止這個處理程序,可以使用 kill 指令:
    
kill 處理程序Id
    

以上面的例子處理程序 Id 就是 860269 :
    
kill 860269
    


註: grep 的意思是 global regular expression

留言