3 votes

utiliser monit pour tuer le bon processus sans connaître son PID

J'essaie d'utiliser monitrice pour trouver les processus infaillibles qui tournent trop longtemps et les tuer.

La machine exécute des constructions parallèles, il est donc possible que plusieurs processus surefire soient exécutés en même temps, mais il n'y a pas de fichier PID pour ces processus.

Ma configuration monit ressemble à ceci :

check process surefire matching "surefire/surefirebooter"
    if uptime > 4 hours then alert
    if uptime > 4 hours then stop

L'alerte est envoyée, mais l'arrêt ne fonctionne pas.

Je ne peux pas utiliser killall puisque le processus est exécuté par java et qu'il y a plusieurs autres processus java en cours d'exécution.

Tout ce dont j'ai besoin est de détecter le bon PID de ce processus pour que je puisse tuer le bon.

6voto

andrej Points 443

Il y a MONIT_PROCESS_PID variable d'environnement propagée dans le contexte du programme exécuté par la commande exec.

if uptime > 4 hours then stop

doit être remplacé par

if uptime > 4 hours then exec "/usr/bin/monit-kill-process.sh"

et le fichier /usr/bin/monit-kill-process.sh devrait ressembler à ceci

#!/bin/bash
# script run from monit instance
# this will find long-running surefire process and kill it

kill -9 $MONIT_PROCESS_PID

Le seul problème est que monit n'est pas le bon outil pour ce travail de toute façon, puisqu'il veut le processus correspondant à la vérifier doit être trouvé à chaque fois qu'il effectue la vérification, sinon il essaie de lancer le processus en utilisant commencer partie de la définition du contrôle (ce qui n'est pas exactement ce que nous voulons faire).

Alors je trouvé et modifié ce oneliner ps/grep/perl/xargs que je lance via cron. Il est capable de trouver des processus à partir de la sous-chaîne de la ligne de commande, de sélectionner ceux qui tournent depuis longtemps et de les traiter correctement.

#!/bin/bash
# script run from monit instance
# this will find long-running surefire process and kill it

readonly PROCESS_STRING="surefireboot"

/bin/ps -e -o pid,time,command \
 | /bin/grep $PROCESS_STRING \
 | /usr/bin/perl -ne 'print "$1 " if /^\s*([0-9]+) ([-0-9]+:[0-9]+:[0-9]+)/ && $2 gt "04:00:00"' \
 | /usr/bin/xargs kill

1voto

ewwhite Points 193555

Monit n'est peut-être pas le bon outil pour cela. Le filtrage n'utilise que la première correspondance.

Ceci peut être testé avec monit procmatch <pattern>

Je suggérerais de marquer vos constructions avec un identifiant unique et de l'utiliser dans la séquence de filtrage... Ou de gérer le démon entièrement avec monit.

Vous n'avez pas besoin d'utiliser killall non plus. Peut-être une logique autour de pkill ou pgrep.

Voir aussi : monit : vérifier un processus sans fichier pid

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