如何自動終止 CPU 負載最高的程序?
有時程序會在後台鎖定並導致 CPU 使用率過高。有什麼方法可以以程式方式確定目前哪個程序導致最高的 CPU 負載並殺死它?
如果您了解此類工作的一系列 Unix 命令,它們可能會為您提供更好的服務。
- pgrep
- 殺戮
- 殺死所有
您可以使用這些工具使您的“攻擊”更有針對性,尤其是在您通過名稱知道行為不端過程的情況下。
殺死所有
我對 Chrome 有一個反復出現的問題,最終需要通過殺死它來處理它。我通常會執行此命令來根除所有這些。
$ killall chrome
pgrep & pkill
但我也可以這樣做,只處理最新的程序:
# to list $ pgrep -n chrome 23108 # to kill $ pkill -n chrome
根據您的命令行進行殺戮
您還可以添加
-f
開關以訪問那些您希望匹配的具有長路徑參數的程序,而不僅僅是它們的執行檔的名稱。例如,假設我有這些過程:
$ ps -eaf | grep some saml 26624 26575 0 22:51 pts/44 00:00:00 some weird command saml 26673 26624 0 22:51 pts/44 00:00:00 some weird command's friend saml 26911 26673 8 22:54 pts/44 00:00:00 some weird command's friend
它們只是將ARGV0設置為這些名稱的 Bash shell。順便說一句,我使用這個技巧製作了這些過程:
$ (exec -a "some weird command name's friend" bash)
追朋友
但是假設我有很多,我只想追踪其中的一組,因為他們的命令行中有“朋友”。我可以這樣做:
$ pgrep -f friend 26673 26911
追求最小的朋友
如果有幾個並且我想追求最新的,請將
-n
開關添加回組合中:$ pgrep -fn friend 26911
您還可以在徵用
-f
開關時使用正則表達式,這樣它們就可以工作,例如:$ pgrep -f "weird.*friend" 26673 26911
顯示他們的名字
-l
您可以使用開關仔細檢查程序名稱:$ pgrep -f "weird.*friend" -l 26673 some weird command's friend 26911 some weird command's friend
控制輸出
或者告訴
pgrep
列出使用逗號 () 分隔的程序 ID,
:$ pgrep -f "weird.*friend" -d, 26673,26911
你可以做這樣很酷的事情:
$ ps -fp $(pgrep -f weird -d,) UID PID PPID C STIME TTY TIME CMD saml 26624 26575 0 22:51 pts/44 00:00:00 some weird command saml 26673 26624 0 22:51 pts/44 00:00:00 some weird command's friend saml 26911 26673 0 22:54 pts/44 00:00:00 some weird command's friend
那麼如何殺死高CPU程序呢?
在追求高 CPU 程序時,我會使用上述方法更有選擇性。您可以使用以下方法進行殺戮:
# newest guys $ pkill -nf vlc ; pkill -nf opensnap # kill all of these $ killall vlc; killall opensnap
查看他們的 CPU 負載:
$ top -b -n 1 | grep -E $(pgrep -f "weird.*friend" -d\|) | grep -v grep 26911 0.1 112m 106m 6408 848 4900 1512 0 0 S 20 0 0.0 some weird command's friend 26673 0.1 112m 106m 6392 848 5020 1504 0 0 S 20 0 0.0 some weird command's friend
在這裡,我將分隔符從逗號 (
,
) 也更改為。這個開關,又名-d,
管道( )。|
這個開關-d\|
,這樣我就可以用它了grep
。這樣做將返回如下程序 ID:$ pgrep -f "weird.*friend" -d\| 26673|26911
然後我們將這些插入到命令中,以便我們可以根據某些程序 ID
grep -E ...
過濾輸出。top
這可能看起來像很多向後彎曲,但我們現在可以肯定地知道,我們正在使用的程序 ID 只是與名為“weird.*friend”的給定程序相關的那些。
如果您真的想這樣做,您可以從這裡找到 CPU 最高的程序並將其殺死。
一種更有針對性的高 CPU 方法
$ top -b -n 1 | grep -E $(pgrep -f "weird.*friend" -d\|) | \ grep -v grep | sort -nk14,14 | tail -1 26911 0.1 112m 106m 6408 848 4900 1512 0 0 S 20 0 0.0 some weird command's friend
上面顯示了按
top
CPU 列(第 14 列)排序的輸出。它是從最低到最高排序的,所以我們取最後一行 (tail -1
),這將是“weird.*friend”程序的最高 CPU 程序。