Frage monit: Überprüfe Prozess ohne Pidfile


Ich suche nach einer Möglichkeit, alle Prozesse mit einem bestimmten Namen zu beenden, die seit mehr als X Zeit ausgeführt werden. Ich spawne viele Instanzen dieser bestimmten ausführbaren Datei, und manchmal geht es in einen schlechten Zustand und läuft für immer und nimmt eine Menge CPU auf.

Ich benutze bereits monit, aber ich weiß nicht, wie man nach einem Prozess ohne eine pid-Datei sucht. Die Regel wäre etwa so:

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

Wie würdest du das in Monit ausdrücken?


35
2018-05-16 20:37


Ursprung


(Sie sollten hier eine Antwort markieren) - ewwhite


Antworten:


In monit können Sie eine übereinstimmende Zeichenfolge für Prozesse ohne PID verwenden. Am Beispiel eines Prozesses namens "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

Vielleicht, wenn Sie überprüfen, ob CPU-Auslastung für 10 Überwachungszyklen (von jeweils 30 Sekunden) auf einem bestimmten Niveau ist, dann neu starten oder beenden, könnte das eine Option sein. Oder du könntest es benutzen Monits Zeitstempel-Test in einer Datei, die sich auf den Prozess bezieht.


76
2018-06-30 03:12



Sei vorsichtig: Es wird nicht funktionieren, es gibt mehr als einen Prozess - ruX
Sie können eine Regexp verwenden: Matching "Otherstuff. * MyProcessname" - user174962


Es gibt kein fertiges Tool mit dieser Funktionalität. Nehmen wir an, Sie möchten PHP-CGI-Skripte beenden, die länger als eine Minute laufen. Mach das:

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 wird Prozesse nach Namen auswählen, ps -o pid,time druckt die Laufzeit für jede PID und analysiert dann die Zeile, extrahiert Zeit daraus und druckt pid, wenn die Zeit mit der definierten Zeit übereinstimmt. Ergebnis zum Töten übergeben.


5
2018-05-17 03:25



der Prozess läuft für sehr Lange Zeit wird merkwürdige Laufzeit (62-13: 53: 05), also sollte die Regexp-Parsing-Laufzeit ([-0-9] +: [0-9] +: [0-9] +) - schauen Sie sich die Minus am Anfang des Ausdrucks. - andrej


Ich habe genau dieses Problem mit ps-watcher gelöst und darüber geschrieben linux.com vor ein paar Jahren. Mit ps-watcher können Sie Prozesse überwachen und basierend auf der akkumulierten Laufzeit beenden. Hier ist die entsprechende Konfiguration von ps-watcher, vorausgesetzt, Ihr Prozess heißt "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

Der Schlüssel ist die Linie

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

was sagt "wenn kumulierte Prozesszeit ist> 1 Stunde und ich bin nicht der Elternprozess, starten Sie mich neu.

Also, ich realisiere, dass die Antwort nicht monit verwendet, aber es funktioniert. PS-Beobachter ist leicht und einfach einzurichten, so dass es nicht schaden, zusätzlich zu Ihrer Monit-Setup.


3
2018-05-17 05:17





Monit kann dies ab Version 5.4 tun:

if uptime > 3 days then restart

Sehen: das Projekt CHANGES-Datei


3
2018-02-26 20:22





Sie könnten dies in Monit als Exec-Anweisung arbeiten.

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

0