題 自動終止隨時間推移使用95%以上資源的流程? Ubuntu的


我不知道你的電腦,但是當我的電腦工作正常時,沒有一個過程吸收95%以上的電腦。我希望有一些故障保護可以殺死任何表現得像這樣的進程。我想到了這一點,因為當我今天早上醒來時,我的筆記本電腦整夜都是在一個流浪的鉻兒童過程中嘎吱嘎吱地叫。

這可能是作為一個cron工作完成的,但在我創建這樣的全職工作之前,我認為我應該在這裡查看。 :)我討厭重新發明輪子。


3
2018-05-03 12:40


起源


這肯定是可能的(使用 ps 和類似的工具)。但真正的問題是,你真的想要嗎?各種類型的檢查程序可以在很長一段時間內保持相當高的CPU使用率,圖像處理也可以採用這種方式。你應該問自己一個問題:是否值得善後 如果 它殺了錯誤的過程? - Bobby
你幾乎總是應該解決潛在的問題。根據資源使用情況盲目地殺死進程並不是一個好主意。這就是內核的內容 OOM殺手 是為了(至少是為了記憶)。 - Dennis Williamson
我也不得不反對任何類型的自動殺死腳本/工作。也許自動通知是正確的方式,你可以決定殺人與否。一旦識別出來,就解決潛在問題。如果您的計算機可以向您的手機發送電子郵件,那麼您可以“實時”或足夠近。 - hotei
許多makefile編譯源代碼 make $(nproc),這將需要約。大多數時候100%的CPU使用率,它不應該被殺死。我建議你調查根本原因,看看佔用了這麼多資源的東西,然後找到一種方法來停止/刪除它。 - boh


答案:


其他人遇到過這個問題,雖然似乎沒有任何內置於Ubuntu的預防機制,但也有一些 思路 關於如何改善這一點。

有類似的 Serverfault問題 提到 monit的 也許可以提供幫助。


1
2017-07-29 17:54





前段時間我為我的大學課程編寫了一個腳本,即控制系統資源(CPU和/或RAM)的使用。您可以通過在腳本開始編輯變量輕鬆更改最大禁止使用。 腳本應該在這樣的背景下啟動:

nohup ./auto_killer.sh &

腳本正在尋找每N秒使用過多資源的進程。如果某個進程使用了太多資源,則運行它的用戶會在其控制台上收到警告消息。如果相同的進程連續2次被發現,它就會被殺死(並且用戶會獲得有關它的信息)。

這是代碼:

#!/bin/bash

Check_Repeating_Time=3; # in seconds
Max_CPU_Usage='25.0'; #%
Max_RAM_Usage='2.0'; #%
Log_Path='/var/log/auto_killer_log'; # path to file when killing logs will be writed

while [ 1 ]; do

    ps -aux | 
    awk '{
        Username = $1;
        Proc_Name = $11;
        CPU_Usage = $3;
        RAM_Usage = $4;
        PID = $2;
        TTY = $7;

        if((CPU_Usage >= '$Max_CPU_Usage' || RAM_Usage >= '$Max_RAM_Usage' ) &&  !($1 == "USER" || $1 == "root" || $1 == "daemon" || $1 == "mysql" || $1 == "avahi" || $1 == "polkitd"))
        {
            Func_Num_of_Ocur = "cat ./auto_killer_data | grep "PID" | wc -l";
            Func_Num_of_Ocur |getline Str_Num_Of_Ocur;              

            if(Str_Num_Of_Ocur == "0")
            {
                system ("echo \"\" >> /dev/" TTY);
                system ("echo \"Process "Proc_Name" used to much of resources. It will be killed in '$Check_Repeating_Time' seconds if it wont stop!\" >> /dev/" TTY );
                system ("echo \"\" >> /dev/" TTY);
                system ("echo "PID" >> ./auto_killer_data.new");
            }
            else
            {
                system ("echo \"\" >> /dev/" TTY);
                system ("echo \"Process "Proc_Name" was killed because it used to much of system resources!\" >> /dev/" TTY );
                system ("echo \"\" >> /dev/" TTY);
                system ("kill -9 " PID);
                Data = "date";
                Data |getline Str_Data;
                system ("echo \""Str_Data"  "Username"  "Proc_Name" "TTY"\" >> '$Log_Path'");
            }
        }
    }';

    if [ -e ./auto_killer_data.new ]; then
        mv ./auto_killer_data.new ./auto_killer_data
    else    
        echo '' > ./auto_killer_data
    fi

    #We wait fo a while and repeate process
    sleep $Check_Repeating_Time\s;
done;

0
2018-05-22 22:12





我以前遇到過類似的問題,這裡是解決它的一小段python代碼:

鏈接到github存儲庫


0
2017-09-18 15:47





我創建了一個腳本, 殺進程,如果CPU使用率在YY秒內大於XX%或者殺死運行時間超過ZZ秒的進程,則會終止數組中列出的某些進程。

  • 您可以在文件頂部設置XX,YY,ZZ。
  • 您可以使用ps或top進行檢查。
  • 還有一個乾運行模式,檢查但不殺死。
  • 最後,如果某些進程被殺死,腳本會發送一封電子郵件。

注意: 這是我在Github上的回購: https://github.com/padosoft/kill-process 

腳本的基本部分(top命令的代碼摘要):

#!/usr/bin/env bash

#max cpu % load
MAX_CPU=90
#max execution time for CPU percentage > MAX_CPU (in seconds 7200s=2h)
MAX_SEC=1800
#sort by cpu
SORTBY=9

#define a processes command name to check
declare -a KILLLIST
KILLLIST=("/usr/sbin/apache2" "/usr/bin/php5-cgi")

#iterate for each process to check in list
for PROCESS_TOCHECK in ${KILLLIST[*]}
do

    #retrive pid with top command order by SORTBY
    PID=$(top -bcSH -n 1 | grep $PROCESS_TOCHECK | sort -k $SORTBY -r | head -n 1 | awk '{print $1}')

    CPU=$(top -p $PID -bcSH -n 1 | grep $PROCESS_TOCHECK | sort -k $SORTBY -r | head -n 1 | awk '{print $9}')
    TIME_STR=$(top -p $PID -bcSH -n 1 | grep $PROCESS_TOCHECK | sort -k $SORTBY -r | head -n 1 | awk '{print $11}')

    # Decode the top CPU time format [dd-]hh:mm.ss.
    TIME_SEC=0
    IFS="-:" read c1 c2 c3 c4 <<< "$TIME_STR"

    #with top command time format is hh:mm.ss, so truncare seconds in c2
    c2=${c2%%.*}

    if [ -n "$c4" ]
    then
      TIME_SEC=$((10#$c4+60*(10#$c3+60*(10#$c2+24*10#$c1))))
    elif [ -n "$c3" ]
    then
      if [ "$CMD" = "ps" ]; then
        TIME_SEC=$((10#$c3+60*(10#$c2+60*10#$c1)))
      else
        TIME_SEC=$(((10#$c3*24)*60*60)+60*(10#$c2+60*10#$c1))             
      fi   
    else
      if [ "$CMD" = "ps" ]; then
        TIME_SEC=$((10#0+(10#$c2+60*10#$c1)))
      else
        TIME_SEC=$((10#0+60*(10#$c2+60*10#$c1)))
      fi
    fi

    #check if need to kill process
    if [ $CPU -gt $MAX_CPU ] && [ $TIME_SEC -gt $MAX_SEC ]; then
        kill -15 $PID
    fi

done
用法:
bash killprocess.sh [dry|kill|--help] [top|ps] [cpu|time]

0
2018-06-06 09:32



@DavidPostill我添加了腳本代碼的摘要。謝謝。 - Lorenzo Padovani
好多了 ... :) - DavidPostill♦