monit: pidfile के बिना प्रक्रिया की जाँच करें


36

मैं किसी दिए गए नाम के साथ सभी प्रक्रियाओं को मारने का एक तरीका ढूंढ रहा हूं जो कि एक्स राशि से अधिक समय से चल रहा है। मैं इस विशेष निष्पादन योग्य के कई उदाहरणों को देखता हूं, और कभी-कभी यह एक बुरी स्थिति में चला जाता है और हमेशा के लिए चलता है, बहुत सी सीपीयू ले रहा है।

मैं पहले से ही monit का उपयोग कर रहा हूँ, लेकिन मुझे नहीं पता कि बिना किसी pid फ़ाइल के किसी प्रक्रिया की जाँच कैसे करें। नियम कुछ इस तरह होगा:

kill all processes named xxxx that have a running time greater than 2 minutes

आप इसे मोनिट में कैसे व्यक्त करेंगे?


( आपको यहां एक उत्तर देना चाहिए )
इविहित

जवाबों:


80

मॉनेट में, आप उन प्रक्रियाओं के लिए एक मिलान स्ट्रिंग का उपयोग कर सकते हैं जिनमें पीआईडी ​​नहीं है। "Myprocessname" नामक प्रक्रिया के उदाहरण का उपयोग करते हुए,

check process myprocessname
        matching "myprocessname"
        start program = "/etc/init.d/myproccessname start"
        stop program = "/usr/bin/killall myprocessname"
        if cpu usage > 95% for 10 cycles then restart

हो सकता है कि अगर आप यह देखने के लिए जांचें कि क्या सीपीयू लोड 10 निगरानी चक्रों (प्रत्येक 30 सेकंड) के लिए एक निश्चित स्तर पर है, तो पुनरारंभ करें या मारें, यह एक विकल्प हो सकता है। या आप प्रक्रिया से संबंधित फाइल पर मॉनेट के टाइमस्टैम्प परीक्षण का उपयोग कर सकते हैं ।


1
सावधान रहें: यह यह काम नहीं करेगा कि एक से अधिक प्रक्रियाएं हैं
ruX

1
आप एक regexp का उपयोग कर सकते हैं: माचिस "अन्य वस्तु। * myprocessname"
user174962

@ruX: क्या होगा यदि कई संबंधित प्रक्रियाएं मेल खाती हैं? वे कैसे संभाला जा सकता है?
kontextify

यह पहला मैच लेता है।
ewwhite

5

उस कार्यक्षमता के साथ कोई तैयार-उपयोग उपकरण नहीं है। मान लें कि आप php-cgi स्क्रिप्ट्स को मारना चाहते हैं, जो कि मिनट से अधिक समय तक चलती है। यह करो:

pgrep php-cgi | xargs ps -o pid,time | perl -ne 'print "$1 " if /^\s*([0-9]+) ([0-9]+:[0-9]+:[0-9]+)/ && $2 gt "00:01:00"' | xargs kill

pgrepनाम से प्रक्रियाओं का चयन करेगा, ps -o pid,timeहर पीआईडी ​​के लिए रनटाइम प्रिंट करता है, और फिर लाइन का विश्लेषण करता है, इसमें से समय निकालता है, और यदि कोई परिभाषित करता है तो पीआईडी ​​प्रिंट करता है। परिणाम को मारने के लिए पारित किया।


बहुत लंबे समय के लिए प्रक्रिया रननिग अजीब रनटाइम (62-13: 53: 05) हो जाती है, इसलिए रनिंग टाइम चलाने का रिग्क्सपप ([-0-9] +: [0-9] +: [0-9] + ) - अभिव्यक्ति की शुरुआत में माइनस को देखें।
andrej

3

मैंने इस सटीक मुद्दे को ps-watcher के साथ हल किया और इसके बारे में linux.com पर कुछ साल पहले लिखा था । पीएस-वॉचर आपको प्रक्रियाओं की निगरानी करने और संचित समय के आधार पर उन्हें मारने की अनुमति देता है। यहाँ प्रासंगिक ps- द्रष्टा विन्यास है, यह मानते हुए कि आपकी प्रक्रिया का नाम 'foo' है:

[foo]
  occurs = every
  trigger = elapsed2secs('$time') > 1*HOURS && $ppid != 1
  action = <<EOT
  echo "$command accumulated too much CPU time" | /bin/mail user\@host
  kill -TERM $pid
EOT

[foo?]
   occurs = none
   action = /usr/local/etc/foo restart

कुंजी लाइन है

trigger = elapsed2secs('$time') > 1*HOURS && $ppid != 1`

जो कहता है 'यदि संचित प्रक्रिया का समय> 1 घंटा है और मैं मूल प्रक्रिया नहीं हूं, तो मुझे पुनरारंभ करें।

इसलिए, मुझे लगता है कि उत्तर में मोनिट का उपयोग नहीं किया गया है, लेकिन यह काम करता है। ps- द्रष्टा हल्का और स्थापित करने के लिए सरल है, इसलिए आपके मौन सेटअप के अलावा इसे चलाने में कोई हानि नहीं है।



0

आप इसे निष्पादित विवरण के रूप में मॉनेट में काम कर सकते हैं।

    if [[ "$(uname)" = "Linux" ]];then killall --older-than 2m someprocessname;fi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.