पुरानी प्रक्रियाओं को खोजें (मारें)


10

मूल रूप से मुझे प्रक्रिया पेड़ को स्कैन करने और उन प्रक्रियाओं को खोजने में सक्षम होने की आवश्यकता है जो एक निश्चित नाम से मेल खाते हैं और एक सप्ताह से अधिक चलने लगे। एक बार उनके पास होने के बाद, मुझे उन्हें मारने की जरूरत है। सभी प्रक्रियाओं को अभी भी सिस्टम द्वारा एक चालू स्थिति के रूप में देखा जाता है, बस किसी भी सिस्टम समय का उपयोग नहीं कर रहा है। वे आम तौर पर इस राज्य में भी हमेशा के लिए बैठेंगे।

आदर्श रूप से मैं कुछ ऐसा ही खोजना चाहूंगा, लेकिन प्रक्रियाओं के लिए।

सिस्टम डेबियन लाइनक्स है और यह स्क्रिप्टेड होगा और क्रोन द्वारा चलाया जाएगा, इसलिए मुझे कुछ बड़े लेकिन समझ में आने वाले मुद्दों के साथ कोई वास्तविक समस्या नहीं है।


4
आप पुरानी-लेकिन-महत्वपूर्ण प्रक्रियाओं और उन लोगों के बीच अंतर करने के लिए कैसे जा रहे हैं जिन्हें आप मारने के लिए खुश हैं?
चॉपर 3

जवाबों:


9

YOu ps, awk और किल के संयोजन के साथ ऐसा कर सकता है:

ps -eo pid,etime,comm

आप एक तीन स्तंभ आउटपुट देता है, प्रक्रिया पीआईडी ​​के साथ, प्रक्रिया शुरू होने के बाद बीता हुआ समय और तर्क के बिना कमांड नाम। बीता हुआ समय इनमें से एक जैसा दिखता है:

mm:ss
hh:mm:ss
d-hh:mm:ss

चूँकि आप ऐसी प्रक्रियाएँ चाहते हैं जो एक सप्ताह से अधिक समय से चल रही हैं, आप उस तीसरे पैटर्न से मेल खाते लाइनों की तलाश करेंगे। आप समय से और इस तरह से कमांड नाम से प्रक्रियाओं को फ़िल्टर करने के लिए awk का उपयोग कर सकते हैं:

ps -eo pid,etime,comm | awk '$2~/^7-/ && $3~/mycommand/ { print $1 }'

जो 'mycommand' से मेल खाने वाले सभी कमांड्स के प्रिंट को प्रिंट करेगा जो 7 दिनों से अधिक समय से चल रहा है। पाइप कि सूची में मार, और आप कर रहे हैं:

ps -eo pid,etime,comm | awk '$2~/^7-/ && $3~/mycommand/ { print $1 }' | kill -9

अच्छा लगा एक धन्यवाद। पीएस में प्रारूपण विकल्पों के बारे में पूरी तरह से भूल गया।
रेनर

2
यह आपको "7 दिनों से अधिक" चलने वाली प्रक्रियाओं को नहीं दिखाता है। यह आपको 7 दिनों के बीच चलने वाली प्रक्रियाओं को दिखाता है लेकिन 8 दिनों से कम समय में।
होबोडवे

etimesअधिक उपयोगी है - serverfault.com/a/393476/67675
'13

4

killall --quiet --older-than 1w process_name


1
यह उबंटू 16.04 पर कमाल का काम करता है और आप परीक्षण करने के लिए -i (इंटरैक्टिव) ध्वज के साथ उपयोग कर सकते हैं और सुनिश्चित कर सकते हैं कि यह उन प्रक्रियाओं को लक्षित कर रहा है जो आपको लगता है कि यह होना चाहिए।
ईज़राइटर

1

आपके द्वारा आवश्यक सभी जानकारी को पकड़ा जा सकता है ps -ef। "STIME" कॉलम देखें। grepआप की जरूरत है कि प्रक्रियाओं को सुलझाने के साथ गठबंधन । उस बिंदु पर, आप cutसभी मिलान प्रक्रियाओं की पीड को हथियाने और उन्हें पास करने के लिए उपयोग कर सकते हैं kill

कृपया मुझे बताएं कि क्या आप ऐसा करने के बारे में अधिक जानकारी चाहते हैं।


मुझे और विवरण चाहिए। अन्य उत्तर बस गलत हैं।
होबोडेव

1

यदि आप जड़ हैं, तो कचरे से छुटकारा पाने के लिए (/ proc / fs proc / stat ...)

find /proc -maxdepth 1 -regex '/proc/[0-9]*' -type d -mtime +2 -exec basename {} \;

0

जब कोई प्रक्रिया शुरू होती है, तो यह / proc फाइलसिस्टम में एक निर्देशिका बनाता है। आप 7 दिनों से अधिक पुरानी निर्देशिका प्राप्त करने और प्रक्रियाओं को मारने के लिए खोज कमांड का उपयोग कर सकते हैं:

find /proc -user myuser -maxdepth 1 -type d -mtime +7 -exec basename {} \; | xargs kill -9 

यह भी काम नहीं करता है। जैसा कि यह इस चेतावनी को उत्पन्न करता है, और कोई अतिरिक्त आउटपुट नहीं: find: warning: you have specified the -maxdepth option after a non-option argument -user, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.चलती -maxdepth पहला आउटपुट होने के लिए यह कोई प्रक्रिया नहीं देता है, और मैं सकारात्मक हूं कि कई मैच होने चाहिए।
होबोडेव

यह भी कि अगर आप डायर के निर्माण की तारीख की तलाश में हैं तो क्यों नहीं माइम? डायर सैद्धांतिक रूप से संशोधित किया जा सकता है अगर एक अतिरिक्त बच्चा बनाया गया था, जो मैं बाहर शासन नहीं करेगा (शायद एक नया लोड किया हुआ कर्नेल मॉड्यूल किसी तरह से sysfs का विस्तार करेगा)
jmtd 16

0

यहां किसी ने भी पीएस-वॉचर का उल्लेख नहीं किया है। मुझे लगता है कि आप elapsed2sec फ़ंक्शन का उपयोग करके $ start_time की तुलना करने में सक्षम हो सकते हैं, लेकिन मैं पूरी तरह से निश्चित नहीं हूं। यहाँ मेरा पहला विचार है:

[myproc]
occurs = every
trigger = elapsed2secs('$start_time') > 7*DAYS
action = <<EOT
  echo "$command has been running more than 7 days" | /bin/mail user\@host
  kill -TERM $pid
EOT

कोई विचार नहीं अगर वह काम करता है, लेकिन यह एक अच्छा प्रारंभिक बिंदु होना चाहिए।

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