एक्स समय के बाद उच्च सीपीयू उपयोग के साथ मार प्रक्रिया? [बन्द है]


21

लिनक्स चल रहा है मेरे पास कुछ प्रक्रियाएं हैं जो कभी-कभी दुर्घटनाग्रस्त होती हैं (गेम सर्वर), जो 100% सीपीयू का उपयोग करके समाप्त होती हैं।

मैं नाम से प्रक्रियाओं की सूची के सीपीयू उपयोग की जांच करने के लिए एक कार्यक्रम या स्क्रिप्ट की तलाश कर रहा हूं और यदि वे एक्स समय से 100% अधिक हैं, तो 30 सेकंड का कहना है, उन्हें मार डालो। मैंने ps-watcher की कोशिश की, लेकिन यह निर्धारित नहीं कर पाया कि इसे कैसे पूरा किया जाए।

बस 100% उपयोग पर प्रक्रिया को मारना काम नहीं करेगा क्योंकि यह सामान्य ऑपरेशन के दौरान संक्षिप्त अवधि के लिए मारा जाएगा।

मुझे यह स्क्रिप्ट भी मिली है, जो मुझे लगता है कि मैं क्या करना चाहता हूं, हालांकि यह एक प्रक्रिया तक सीमित है: लिंक

कोई भी मदद बहुत ही सराहनीय होगी!


क्या आप फिर से स्क्रिप्ट के लिए एक लिंक पोस्ट कर सकते हैं क्योंकि यह एक pastebin.com/m1c814cb4 है जो किसी भी अधिक मान्य नहीं है।

क्या मैं अनुमान लगाने में सही होगा कि आप Minecraft सर्वर चला रहे हैं? ;)
फोनेटुक

@ क्रिस एस आप सुस्त हैं। यह एक बहुत ही दिलचस्प सवाल है। क्या आप अपने दावों के लिए एक स्रोत प्रदान कर सकते हैं "क्योंकि वे कम गुणवत्ता, राय और स्पैम उत्तरों को आकर्षित करते हैं, और उत्तर जल्दी से अप्रचलित हो जाते हैं?" और क्या आप इस बात के लिए कुछ उदाहरण दे सकते हैं कि इस प्रश्न के मौजूदा उत्तर कैसे रहते हैं? मैने अपनी सांस नहीं रोक रखी है।
db

जवाबों:


19

मॉनेट की कोशिश करें ।

आप अपने कार्य को पूरा करने के लिए इस तरह के कॉन्फ़िगरेशन का उपयोग कर सकते हैं:

check process gameserver with pidfile /var/run/gameserver.pid
  start program = "/etc/init.d/gameserver start" with timeout 60 seconds
  stop program  = "/etc/init.d/gameserver stop"
  if cpu > 80% for 2 cycles then alert
  if cpu > 95% for 5 cycles then restart
  if totalmem > 200.0 MB for 5 cycles then restart
  if loadavg(5min) greater than 10 for 8 cycles then stop
  if failed port 12345 type tcp with timeout 15 seconds
    then restart
  if 3 restarts within 5 cycles then timeout

इस विन्यास के बारे में विवरण मोनिट के प्रलेखन में पाया जा सकता है ।


जवाब देने के लिए धन्यवाद! क्या इसे मॉनीट के साथ शुरू किए बिना प्रक्रिया की निगरानी करने का कोई तरीका है? मेरे पास मशीन पर चलने वाले एक टन सर्वर हैं जो एक वेब इंटरफेस के माध्यम से प्रबंधित किए जाते हैं, उन्हें मोनिट के साथ लॉन्च करने के लिए आदर्श नहीं है।
user30153

ज़रूर, start programऔर stop programलाइनें केवल उस मामले के लिए हैं जब monitआपकी प्रक्रिया को पुनरारंभ करने की आवश्यकता होती है। आप अभी भी इसे अपने सामान्य init स्क्रिप्ट के साथ शुरू कर सकते हैं। monitयह भी देख सकते हैं कि क्या प्रोग्राम पहले से चल रहा है (उदाहरण के लिए इसकी पीआईडी ​​फ़ाइल या प्रक्रिया नाम)।
जोशी २ j'०

शानदार, मुझे लगता है कि मुझे यह समझ में आ गया है। एकमात्र समस्या यह है कि यह एक पीआईडी ​​फ़ाइल पर निर्भरता है, मैं 200 से अधिक प्रक्रियाओं के लिए एक उत्पन्न करने जा रहा हूं, और हर एक के लिए नियम बनाता हूं जो मुझे लगता है। सहायता के लिए धन्यवाद!
user30153

4

यह वही था जिसकी मैं तलाश कर रहा था, और पिछले कुछ समय से इसका उपयोग कर रहा था (थोड़ा बदला हुआ)। हाल ही में, मैंने अपने काम में एक बग रखा है लेकिन ऐप (गेम सर्वर) को चालू रखने की आवश्यकता है।
मैंने उस हिस्से को उद्धृत किया था जहां सबसे ऊपर पीआईडी ​​को मार दिया जाता है, क्योंकि यह गलत पीआईडी ​​को मार रहा था।
यहाँ आपकी स्क्रिप्ट का मेरा नवीनतम ड्राफ्ट है, अब तक, यह सबसे अधिक अधिभार पाता है और इसे प्रभावी रूप से मारता है (जब भी यह कुछ भी करता है तो मुझे जानकारी के साथ ईमेल करता है);

#!/bin/bash

## Note: will kill the top-most process if the $CPU_LOAD is greater than the $CPU_THRESHOLD.
echo
echo checking for run-away process ...

CPU_LOAD=$(uptime | cut -d"," -f4 | cut -d":" -f2 | cut -d" " -f2 | sed -e "s/\.//g")
CPU_THRESHOLD=300
PROCESS=$(ps aux r)
TOPPROCESS=$(ps -eo pid -eo pcpu -eo command | sort -k 2 -r | grep -v PID | head -n 1)

if [ $CPU_LOAD -gt $CPU_THRESHOLD ] ; then
  # kill -9 $(ps -eo pid | sort -k 1 -r | grep -v PID | head -n 1) #original
  # kill -9 $(ps -eo pcpu | sort -k 1 -r | grep -v %CPU | head -n 1)
  kill -9 $TOPPROCESS
  echo system overloading!
  echo Top-most process killed $TOPPROCESS
  echo load average is at $CPU_LOAD
  echo 
  echo Active processes...
  ps aux r

  # send an email using mail
  SUBJECT="Runaway Process Report at Marysol"
  # Email To ?
  EMAIL="myemail@somewhere.org"
  # Email text/message
  EMAILMESSAGE="/tmp/emailmessage.txt"
  echo "System overloading, possible runaway process."> $EMAILMESSAGE
  echo "Top-most process killed $TOPPROCESS" >>$EMAILMESSAGE
  echo "Load average was at $CPU_LOAD" >>$EMAILMESSAGE
  echo "Active processes..." >>$EMAILMESSAGE
  echo "$PROCESS" >>$EMAILMESSAGE
  mail -s "$SUBJECT" "$EMAIL" < $EMAILMESSAGE

else
 echo
 echo no run-aways. 
 echo load average is at $CPU_LOAD
 echo 
 echo Active processes...
 ps aux r
fi
exit 0


यह छोटी स्क्रिप्ट बेहद उपयोगी रही है, अगर आपको यह पसंद नहीं है कि किसी भी प्रक्रिया को मार दिया जाए, तो ईमेल अकेले आपको सूचित रखने में मदद करेगा।


आपके उत्तर के लिए धन्यवाद! मैं सिर्फ यह बताना चाहूंगा कि आपकी छंटनी TOPPROCESSबंद है। यह वास्तविक मूल्य के अनुसार नहीं होगा, इसके बजाय यह प्रविष्टियों को अल्फ़ान्यूमेरिक रूप से ऑर्डर करेगा (उदाहरण के लिए 6% में 12% से अधिक पूर्ववर्ती होगा)। एक बेहतर विकल्प निम्नलिखित कमांड हो सकता है:top -b -n 1 | sed 1,6d | sed -n 2p
Glutanimate

1
यदि CPU 90% है तो CPU_LOAD क्या है? और आप कैसे सीमा की गणना करते हैं? धन्यवाद
Ofir Attia

1
यह अभ्यस्त उन स्थितियों को पकड़ता है जहां एक प्रक्रिया मल्टी कोर सर्वर पर अधिकतम होती है।
अपक्रीच

0

नीचे एक नमूना BASH स्क्रिप्ट है जो आपको अपनी आवश्यकताओं के लिए कुछ संकेत प्राप्त करने में मदद कर सकती है।

#!/bin/bash

CPU_LOAD=$(uptime | cut -d"," -f4 | cut -d":" -f2 | cut -d" " -f2 | sed -e "s/\.//g")
CPU_THRESHOLD=700

if [ $CPU_LOAD -gt $CPU_THRESHOLD ] ; then
  kill -9 $(ps -eo pid | sort -k 1 -r | grep -v PID | head -n 1)
fi

exit 0

कृपया ध्यान दें कि आपके $ CPU_THRESHOLD का मान आपके सिस्टम पर आपके (CPU) कोर की संख्या पर निर्भर होना चाहिए। इस विषय के बारे में विस्तृत विवरण http://blog.scoutapp.com/articles/2009/07/31/understanding-load-aactions पर पाया जा सकता है ।

आप अपनी स्क्रिप्ट को / etc / inittab के अंदर से कॉल कर सकते हैं या अपनी पसंद के प्रत्येक नंबर के लिए क्रोनजोब कर सकते हैं। कृपया ध्यान दें कि उदाहरण स्क्रिप्ट शीर्ष-सबसे अधिक प्रक्रिया को मार देगी यदि $ CPU_LOAD $ CPU_THRESHOLD से अधिक है।

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