monit: ตรวจสอบกระบวนการที่ไม่มี pidfile


36

ฉันกำลังมองหาวิธีที่จะฆ่ากระบวนการทั้งหมดด้วยชื่อที่กำหนดซึ่งใช้เวลานานกว่า X ฉันวางไข่หลายครั้งของการปฏิบัติการที่เฉพาะเจาะจงนี้และบางครั้งมันก็ตกอยู่ในสภาพไม่ดีและทำงานตลอดไปโดยใช้ซีพียูมากมาย

ฉันใช้ monit อยู่แล้ว แต่ฉันไม่รู้วิธีตรวจสอบกระบวนการที่ไม่มีไฟล์ pid กฎจะเป็นดังนี้:

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

คุณจะแสดงสิ่งนี้ในหน่วย monit อย่างไร


( คุณควรทำเครื่องหมายคำตอบที่นี่ )
ewwhite

คำตอบ:


80

ใน monit คุณสามารถใช้สตริงที่ตรงกันสำหรับกระบวนการที่ไม่มี PID ใช้ตัวอย่างของกระบวนการที่ชื่อว่า "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

บางทีถ้าคุณตรวจสอบเพื่อดูว่าโหลดของ CPU อยู่ในระดับที่แน่นอนสำหรับการตรวจสอบ 10 รอบ (แต่ละ 30 วินาที) จากนั้นเริ่มต้นใหม่หรือฆ่าซึ่งอาจเป็นตัวเลือก หรือคุณสามารถใช้การทดสอบเวลาของ monitบนไฟล์ที่เกี่ยวข้องกับกระบวนการ


1
ระวัง: มันใช้งานไม่ได้เพราะมีมากกว่าหนึ่งกระบวนการ
ruX

1
คุณสามารถใช้ regexp: จับคู่ "otherstuff. * myprocessname"
174962

@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พิมพ์รันไทม์สำหรับ pid ทุกอันจากนั้นวิเคราะห์บรรทัดดึงเวลาจากมันและพิมพ์ pid ถ้าเวลาเปรียบเทียบกับที่กำหนดไว้ ส่งผลให้ฆ่า


กระบวนการ runnig เป็นเวลานานจะได้รับ runtime แปลก ๆ (62-13: 53: 05) ดังนั้นเวลาในการแยกวิเคราะห์ regexp ควรจะเป็น ([-0-9] +: [0-9] +: [0-9] + ) - ดูเครื่องหมายลบที่จุดเริ่มต้นของนิพจน์
andrej

3

ฉันแก้ไขปัญหาตรงนี้กับ ps-watcher และเขียนเกี่ยวกับเรื่องนี้ในlinux.comไม่กี่ปีก่อน ps-watcher ช่วยให้คุณตรวจสอบกระบวนการและฆ่าพวกเขาตามเวลาทำงานสะสม นี่คือการกำหนดค่า ps-watcher ที่เกี่ยวข้องโดยสมมติว่ากระบวนการของคุณมีชื่อว่า '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 ชั่วโมงและฉันไม่ใช่กระบวนการหลักให้เริ่มฉันใหม่

ดังนั้นฉันจึงรู้ว่าคำตอบนั้นไม่ได้ใช้ monit แต่มันใช้ได้ผล ps-watcherมีน้ำหนักเบาและตั้งค่าได้ง่ายดังนั้นจึงไม่เป็นอันตรายต่อการใช้งานนอกจากการตั้งค่า monit ของคุณ



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.