মনিট: পিডফাইল ছাড়াই চেক প্রক্রিয়া


36

আমি প্রদত্ত নামের সাথে সমস্ত প্রক্রিয়া হত্যার একটি উপায় খুঁজছি যা সময়ের সাথে X এরও বেশি সময় ধরে চলছে। আমি এই নির্দিষ্ট কার্যকরকরণের অনেকগুলি উদাহরণ রেখেছি, এবং কখনও কখনও এটি খারাপ অবস্থায় চলে যায় এবং চিরকালের জন্য চলে যায়, প্রচুর সিপিইউ গ্রহণ করে।

আমি ইতিমধ্যে মনিট ব্যবহার করছি, তবে পিড ফাইল ছাড়াই কীভাবে প্রক্রিয়া পরীক্ষা করতে হয় তা আমি জানি না। নিয়মটি এরকম কিছু হবে:

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

আপনি এটি মনিটে প্রকাশ করবেন কীভাবে?


( আপনার এখানে একটি উত্তর চিহ্নিত করা উচিত )
ইন্দোহাইট

উত্তর:


80

Monit- এ, আপনি পিআইডি নেই এমন প্রসেসের জন্য একটি ম্যাচিং স্ট্রিং ব্যবহার করতে পারেন। "মাইপ্রোসেসনাম" নামে একটি প্রক্রিয়ার উদাহরণ ব্যবহার করে,

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
সতর্কতা অবলম্বন করুন: এটি কাজ করবে না একাধিক প্রক্রিয়া আছে
রুक्स

1
আপনি একটি regexp ব্যবহার করতে পারেন: ম্যাচিং "othrstuff। * মাইপ্রোসেসনাম"
user174962

@ আরএক্স: একাধিক সম্পর্কিত প্রক্রিয়া মেলে কি হবে? তারা কীভাবে পরিচালনা করতে পারে?
কনটেক্সটিফাই করুন

এটি প্রথম ম্যাচ লাগে।
ew white

5

সেই কার্যকারিতা সহ কোনও ব্যবহারের জন্য প্রস্তুত-সরঞ্জাম নেই। ধরে নেওয়া যাক আপনি পিএইচপি-সিজি স্ক্রিপ্টগুলি মারতে চান, এটি মিনিটের চেয়ে বেশি সময় ধরে চলে। এটা কর:

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

আমি পিএস- ওয়াচারের সাথে এই সঠিক সমস্যাটি সমাধান করেছি এবং কয়েক বছর আগে লিনাক্স ডটকমলিখেছিলাম । পিএস-নজরদারি আপনাকে প্রক্রিয়াগুলি নিরীক্ষণ করতে এবং সঞ্চয়ের সময় অনুসারে তাদের হত্যা করতে দেয়। আপনার প্রসেসটির নাম রাখা হয়েছে অনুমান করে এখানে পিএস-ওয়াচার কনফিগারেশনটি প্রাসঙ্গিক:

[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 ঘন্টা হয় এবং আমি মূল প্রক্রিয়া না হই তবে আমাকে পুনরায় চালু করুন।

সুতরাং, আমি বুঝতে পারি যে উত্তরটি মনিট ব্যবহার করে না, তবে এটি কাজ করে। পিএস-ওয়াচারটি হালকা ওজনের এবং সেটআপ করা সহজ, সুতরাং এটি আপনার মনিট সেটআপের পাশাপাশি চালানোর কোনও ক্ষতি নেই।



0

আপনি এটি এক্সিকিউট স্টেটমেন্ট হিসাবে মনিট এ কাজ করতে পারে।

    if [[ "$(uname)" = "Linux" ]];then killall --older-than 2m someprocessname;fi
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.