41 votes

Monit: vérifiez le processus sans pidfile

Je cherche un moyen de tuer tous les processus portant un nom donné qui tournent depuis plus de X temps. Je lance de nombreuses instances de cet exécutable en particulier, et parfois il passe dans un mauvais état et tourne indéfiniment, prenant beaucoup de CPU.

Je suis déjà en train d'utiliser monit, mais je ne sais pas comment vérifier un processus sans fichier pid. La règle serait quelque chose comme ça :

tuer tous les processus nommés xxxx qui ont un temps d'exécution supérieur à 2 minutes

Comment exprimeriez-vous cela dans monit?

85voto

ewwhite Points 193555

Dans monit, vous pouvez utiliser une chaîne correspondante pour les processus qui n'ont pas de PID. En utilisant l'exemple d'un processus nommé "nomdeprocessus",

check process nomdeprocessus
        matching "nomdeprocessus"
        start program = "/etc/init.d/myproccessname start"
        stop program = "/usr/bin/killall myprocessname"
        if cpu usage > 95% for 10 cycles then restart

Peut-être que si vous vérifiez si la charge CPU est à un certain niveau pendant 10 cycles de surveillance (de 30 secondes chacun), alors redémarrer ou tuer, cela pourrait être une option. Ou vous pourriez utiliser le test de timestamp de monit sur un fichier lié au processus.

5voto

user64075 Points 253

Il n'existe pas d'outil prêt à l'emploi avec cette fonctionnalité. Supposons que vous souhaitiez tuer des scripts php-cgi qui s'exécutent depuis plus d'une minute. Faites ceci :

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 sélectionnera les processus par nom, ps -o pid,time affichera le temps d'exécution pour chaque pid, puis analysera la ligne, extraira le temps et affichera le pid si le temps est supérieur à celui défini. Le résultat est passé à kill.

3voto

RyanBrady Points 1903

J'ai résolu ce problème exact avec ps-watcher et j'en ai parlé sur linux.com il y a quelques années. ps-watcher vous permet de surveiller les processus et de les arrêter en fonction du temps d'exécution cumulé. Voici la configuration pertinente de ps-watcher, en supposant que votre processus s'appelle 'foo' :

[foo]
  occurs = every
  trigger = elapsed2secs('$time') > 1*HOURS && $ppid != 1
  action = <

``

La clé est la ligne

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

qui signifie 'si le temps d'exécution cumulé du processus est > 1 heure ET je ne suis pas le processus parent, redémarrez-moi.

Donc, je sais que cette réponse n'utilise pas monit, mais cela fonctionne. ps-watcher est léger et simple à configurer, donc il n'y a pas de mal à l'exécuter en plus de votre configuration monit.

``

3voto

avi Points 11

Monit peut le faire à partir de la version 5.4 :

if uptime > 3 jours alors redémarrer

Voir : le fichier CHANGES du projet

0voto

Jodie C Points 733

Vous pourriez intégrer ceci dans monit en tant qu'instruction exec.

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X