monit: periksa proses tanpa pidfile

37

Saya mencari cara untuk membunuh semua proses dengan nama yang diberikan yang telah berjalan selama lebih dari X jumlah waktu. Saya menelurkan banyak contoh dari executable khusus ini, dan kadang-kadang masuk ke kondisi buruk dan berjalan selamanya, mengambil banyak cpu.

Saya sudah menggunakan monit, tetapi saya tidak tahu cara memeriksa proses tanpa file pid. Aturannya akan seperti ini:

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

Bagaimana Anda mengekspresikan ini dalam monit?

Parand
sumber
( Anda harus menandai jawaban di sini )
ewwhite

Jawaban:

80

Dalam monit, Anda dapat menggunakan string yang cocok untuk proses yang tidak memiliki PID. Menggunakan contoh proses bernama "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

Mungkin jika Anda memeriksa untuk melihat apakah beban CPU berada pada level tertentu untuk 10 siklus pemantauan (masing-masing 30 detik), lalu hidupkan ulang atau matikan, itu bisa menjadi pilihan. Atau Anda dapat menggunakan pengujian cap waktu monit pada file yang terkait dengan proses.

putih
sumber
1
Hati-hati: itu tidak akan berhasil, ada lebih dari satu proses
ruX
1
Anda dapat menggunakan regexp: matchin "otherstuff. * myprocessname"
user174962
@ruX: apa yang terjadi jika beberapa proses terkait cocok? Bagaimana mereka bisa ditangani?
kontextify
Dibutuhkan pertandingan pertama.
ewwhite
5

Tidak ada alat yang siap digunakan dengan fungsi itu. Anggap Anda ingin membunuh skrip php-cgi, yang berjalan lebih lama dari menit. Melakukan hal ini:

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

pgrepakan memilih proses berdasarkan nama, ps -o pid,timemencetak runtime untuk setiap pid, dan kemudian menganalisis baris, mengekstrak waktu dari itu, dan mencetak pid jika waktu membandingkan dengan yang ditetapkan. hasil disahkan untuk membunuh.

datacompboy
sumber
proses runnig untuk waktu yang sangat lama mendapat runtime yang aneh (62-13: 53: 05), sehingga waktu menjalankan penguraian regexp seharusnya ([-0-9] +: [0-9] +: [0-9] + ) - lihat minus di awal ekspresi.
andrej
3

Saya memecahkan masalah ini dengan ps-watcher dan menulis tentang hal itu di linux.com beberapa tahun yang lalu. ps-watcher memungkinkan Anda untuk memonitor proses dan membunuh mereka berdasarkan akumulasi run time. Berikut konfigurasi ps-watcher yang relevan, dengan anggapan proses Anda bernama '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

Kuncinya adalah garis

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

yang mengatakan 'jika akumulasi waktu proses> 1 jam DAN aku bukan proses induk, restart saya.

Jadi, saya menyadari bahwa jawaban tidak menggunakan monit, tetapi berhasil. ps-watcher ringan dan mudah diatur, jadi tidak ada salahnya menjalankannya selain pengaturan monit Anda.

Phil Hollenback
sumber
3

Monit dapat melakukan ini pada versi 5.4:

if uptime > 3 days then restart

Lihat: file PERUBAHAN proyek

David Radcliffe
sumber
0

Anda dapat mengerjakan ini menjadi monit sebagai pernyataan eksekutif.

    if [[ "$(uname)" = "Linux" ]];then killall --older-than 2m someprocessname;fi
Jodie C
sumber