स्वचालित रूप से प्रक्रियाओं को मार डालो जो समय के साथ संसाधनों के 95% + का उपयोग करता है? उबंटू


3

मैं आपके कंप्यूटर के बारे में नहीं जानता लेकिन जब मेरा काम ठीक से हो रहा है तो कोई भी प्रक्रिया समय के साथ 95% + नहीं चूस रही है। मैं कुछ ऐसे विफल होना चाहूंगा जो उस तरह की व्यवहार करने वाली किसी भी प्रक्रिया को मार दें। यह ध्यान में आता है क्योंकि जब मैं आज सुबह उठा तो मेरा लैपटॉप एक आवारा क्रोमियम बच्चे की प्रक्रिया पर रात भर क्रंच कर रहा था।

यह संभवत: क्रोन जॉब के रूप में किया जा सकता है, लेकिन इससे पहले कि मैं इसे फुल टाइम जॉब बनाऊं कुछ इस तरह का काम करता है जैसा मैंने सोचा था कि मुझे यहां देखना चाहिए। :) मुझे पहिये को फिर से लगाने से नफरत है।


2
यह सुनिश्चित करने के लिए संभव है (उपयोग psऔर इसी तरह के उपकरण)। लेकिन असली सवाल यह है कि क्या आप वास्तव में ऐसा चाहते हैं? सभी प्रकार के चेक-प्रोग्राम कुछ समय के लिए बहुत उच्च सीपीयू उपयोग को पीस सकते हैं, छवि-प्रसंस्करण भी ले सकते हैं। आप अपने आप को एक सवाल पूछना चाहिए: इसके लायक बाद है अगर यह गलत प्रक्रिया को मारता है?
बॉबी

3
आपको लगभग हमेशा अंतर्निहित समस्या को ठीक करना चाहिए। यह वास्तव में उनके संसाधन उपयोग के आधार पर प्रक्रियाओं को नेत्रहीन रूप से मारने के लिए एक अच्छा विचार नहीं है। यही कर्नेल का OOM- हत्यारा है (कम से कम स्मृति के लिए)।
डेनिस विलियमसन

मुझे किसी भी तरह की ऑटो-किल स्क्रिप्ट / जॉब के साथ इसे करने के लिए भी तर्क देना होगा। हो सकता है कि ऑटो-नोटिफ़िकेशन सही तरीका हो और आप हत्या करने या न करने का फैसला कर सकते हैं। पहचान होने के बाद अंतर्निहित समस्या को ठीक करें। यदि आपका कंप्यूटर आपके फोन पर ईमेल भेज सकता है तो आप यह "वास्तविक समय" कर सकते हैं या पर्याप्त बंद कर सकते हैं।
Hotei

कई makefile संकलन स्रोत कोड के साथ make $(nproc), यह लगभग ऊपर ले जाएगा। ज्यादातर समय 100% सीपीयू का उपयोग होता है, और इसे नहीं मारना चाहिए। मैं आपको मूल कारण की जांच करने और यह देखने के लिए सलाह दूंगा कि इतने संसाधन क्या हैं, फिर इसे रोकने / हटाने का कोई तरीका खोजें।
बोह

जवाबों:


1

अन्य लोगों ने इस समस्या का सामना किया है, और जब तक कि उबंटू के लिए किसी भी रोकथाम तंत्र का निर्माण नहीं होता है, इस बारे में कुछ विचार हैं कि इसे कैसे सुधारें।

वहाँ एक समान है serverfault सवाल है कि उल्लेख Monit मदद करने में सक्षम हो सकता है।


0

कुछ समय पहले मैंने अपने विश्वविद्यालय की कक्षाओं के लिए एक स्क्रिप्ट बनाई थी, जो सिस्टम संसाधनों (सीपीयू और / या रैम) के उपयोग को नियंत्रित कर रही थी। स्क्रिप्ट प्रारंभ में चर को संपादित करके आप अधिकतम निषिद्ध उपयोग को आसानी से बदल सकते हैं। स्क्रिप्ट को इस तरह से शुरू किया जाना चाहिए:

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

मैंने एक स्क्रिप्ट, किल-प्रक्रिया बनाई है , जो एक सरणी में सूचीबद्ध कुछ प्रक्रियाओं को मारता है, अगर CPU उपयोग YY सेकंड के लिए XX% से अधिक है या ZZ सेकंड से अधिक चलने वाली प्रक्रियाओं को मार सकता है।

  • आप फ़ाइल के शीर्ष में XX, YY, ZZ सेट कर सकते हैं।
  • आप चेक प्रक्रियाओं के लिए पीएस या शीर्ष का उपयोग कर सकते हैं।
  • सूखी रन मोड भी है, जांच करने के लिए लेकिन मार नहीं।
  • अंत में, स्क्रिप्ट एक ईमेल भेजती है अगर कुछ प्रक्रियाओं को मार दिया गया था।

नोट: यहाँ Github पर मेरा रेपो है: https://github.com/padosoft/kill-process

स्क्रिप्ट का आवश्यक हिस्सा (शीर्ष कमांड के लिए एक कोड सार):

#!/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]

@DavidPostill मैं स्क्रिप्ट कोड का एक सार जोड़ता हूं। धन्यवाद।
लोरेंजो पडोवनी

बहुत बेहतर ... :)
DavidPostill
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.