monit: pidfile olmadan süreci kontrol et


36

X'ten fazla süredir çalışan belirli bir isimdeki tüm işlemleri öldürmenin bir yolunu arıyorum. Bu özel çalıştırılabilirin birçok örneğini doğurdum, ve bazen kötü bir duruma giriyor ve sonsuza kadar sürüyor, çok fazla işlemci alıyor.

Zaten monit kullanıyorum, fakat pid dosyası olmayan bir işlemi nasıl kontrol edeceğimi bilmiyorum. Kural böyle bir şey olurdu:

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

Bunu monit olarak nasıl ifade edersiniz?


( burada bir cevap işaretlemelisiniz )
ewwhite

Yanıtlar:


80

Monit'te, PID'si olmayan işlemler için eşleşen bir dize kullanabilirsiniz. "İşlemim Adı" adlı bir işlem örneğini kullanarak,

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

Belki CPU yükünün 10 izleme döngüsü (her biri 30 saniyelik) için belirli bir seviyede olup olmadığını kontrol ederseniz, yeniden başlatın veya öldürün, bu bir seçenek olabilir. Veya monit'in zaman damgası testini işlemle ilgili bir dosya üzerinde kullanabilirsiniz .


1
Dikkatli olun: işe yaramayacak birden fazla işlem var
ruX

1
Bir regexp kullanabilirsiniz: matchin "otherstuff. * myprocessname"
user174962

@ruX: Birden fazla ilgili işlem eşleşirse ne olur? Nasıl idare edilebilirler?
Ekim’de

İlk eşleşmeyi alır.
ewwhite

5

Bu işlevselliğe sahip kullanıma hazır bir araç yoktur. Dakikadan daha uzun süren php-cgi komut dosyalarını öldürmek istediğinizi varsayalım. Bunu yap:

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

pgrepsüreçleri ada göre seçer, ps -o pid,timeher pid için çalışma zamanını yazdırır ve sonra çizgiyi analiz eder, ondan zamanı alır ve zaman tanımlanmış olanla karşılaştırırsa pid yazdırır. sonuç öldürmek için geçti.


Çok uzun zamandır devam eden süreç tuhaf çalışma süresi (62-13: 53: 05) alır, bu nedenle regexp ayrıştırma işlem süresi şöyle olmalıdır ([-0-9] +: [0-9] +: [0-9] + ) - ifadenin başlangıcındaki eksi değerine bakın.
andrej

3

Bu sorunu ps-watcher ile çözdüm ve birkaç yıl önce linux.com'da yazdım . ps-watcher, süreçleri izlemenizi ve biriktirilmiş çalışma süresine bağlı olarak öldürmenizi sağlar. İşleminizin 'foo' olarak adlandırıldığı varsayılarak, ilgili ps-watcher yapılandırması:

[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

Anahtar çizgi

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

'Eğer biriken işlem süresi> 1 saatse VE ben ana süreç değilim,' beni yeniden başlat.

Bu yüzden cevabın para kullanmadığını ama işe yaradığını fark ettim. ps-watcher'ın kurulumu hafif ve kolaydır, bu nedenle monit kurulumunuza ek olarak çalıştırmanın zararı yoktur.



0

Bunu exec ifadesi olarak monit olarak çalıştırabilirsiniz.

    if [[ "$(uname)" = "Linux" ]];then killall --older-than 2m someprocessname;fi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.