monit: controlla il processo senza pidfile


37

Sto cercando un modo per uccidere tutti i processi con un determinato nome che sono stati in esecuzione per più di X quantità di tempo. Ho generato molti esempi di questo particolare eseguibile, e a volte va in cattivo stato e funziona per sempre, occupando molto CPU.

Sto già usando Monit, ma non so come verificare un processo senza un file pid. La regola sarebbe qualcosa del genere:

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

Come lo esprimeresti in monit?


( dovresti contrassegnare una risposta qui )
ewwhite

Risposte:


80

In monit, è possibile utilizzare una stringa corrispondente per i processi che non dispongono di un PID. Utilizzando l'esempio di un processo denominato "nomeprocesso",

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

Forse se controlli per vedere se il carico della CPU è a un certo livello per 10 cicli di monitoraggio (di 30 secondi ciascuno), quindi riavvia o uccidi, potrebbe essere un'opzione. Oppure puoi usare il test di data e ora di Monit su un file relativo al processo.


1
Fai

1
puoi usare un regexp: matchin "otherstuff. * nomeprocesso"
user174962

@ruX: cosa succede se più processi correlati corrispondono? Come possono essere gestiti?
kontextify

Prende la prima partita.
ewwhite,

5

Non esiste uno strumento pronto per l'uso con quella funzionalità. Supponiamo che tu voglia uccidere gli script php-cgi, che durano più di un minuto. Fai questo:

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

pgrepselezionerà i processi per nome, ps -o pid,timestampa il runtime per ogni pid, quindi analizzerà la linea, ne estrarrà il tempo e stamperà il pid se il tempo si confronta con quello definito. risultato passato per uccidere.


il processo di runnig per molto tempo ottiene uno strano runtime (62-13: 53: 05), quindi il tempo di esecuzione dell'analisi regexp dovrebbe essere ([-0-9] +: [0-9] +: [0-9] + ) - guarda il meno all'inizio dell'espressione.
andrej,

3

Ho risolto questo esatto problema con ps-watcher e ne ho scritto qualche anno fa su linux.com . ps-watcher ti consente di monitorare i processi e di ucciderli in base al tempo di esecuzione accumulato. Ecco la configurazione ps-watcher pertinente, supponendo che il tuo processo sia chiamato "pippo":

[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

La chiave è la linea

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

che dice "se il tempo di processo accumulato è> 1 ora E io non sono il processo principale, riavviami.

Quindi, mi rendo conto che la risposta non usa il monit, ma funziona. ps-watcher è leggero e semplice da configurare, quindi non c'è nulla di male a eseguirlo in aggiunta alla configurazione del monit.



0

Potresti farlo diventare monit come un'istruzione exec.

    if [[ "$(uname)" = "Linux" ]];then killall --older-than 2m someprocessname;fi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.