Process

如何自動終止 CPU 負載最高的程序?

  • June 25, 2019

有時程序會在後台鎖定並導致 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

然後我們將這些插入到命令中,以便我們可以根據某些程序 IDgrep -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                                     

上面顯示了按topCPU 列(第 14 列)排序的輸出。它是從最低到最高排序的,所以我們取最後一行 ( tail -1),這將是“weird.*friend”程序的最高 CPU 程序。

引用自:https://unix.stackexchange.com/questions/90155