2 votes

linux + créer un processus simple de chien de garde dans Shell Shell.

J'ai besoin de créer un processus "watch dog" (qui fonctionnera sous linux version 5.x) qui regarde tout le temps sur le fichier /etc/cluster.cf

Et si le processus correspond à la chaîne : machineA_is_active dans le fichier cluster.cf

Ensuite, ce processus va exécuter d'autres script.

Ma question est la suivante : comment exécuter ce processus de manière à ce qu'il soit actif et fonctionne tout le temps que Linux est actif ?

et dans le cas où ce processus est en panne, il faut le relancer.

Quelle est la structure de base pour ce scénario ?

(Je serai heureux si je reçois un exemple réel)

0 votes

Quelle est votre distribution Linux ?

2voto

stew Points 9143

Je ne recommanderais pas d'essayer de garder un processus en cours d'exécution tout le temps pour faire cela. Il existe des méthodes plus simples. Votre machine devrait avoir cron en cours d'exécution, qui est un planificateur de tâches périodiques. Vous pouvez programmer l'exécution périodique d'un processus, aussi souvent qu'une fois par minute, pour vérifier le contenu du fichier et faire ce qui doit être fait. Vous pouvez ajouter quelque chose comme ceci à la crontab :

* * * * * /path/to/yourscript

voir man 1 crontab y man 5 crontab y man 8 cron pour plus d'informations sur cron.

Il est encore mieux d'utiliser incron qui vous permet de spécifier un processus à exécuter à chaque fois que ce fichier est modifié. Si vous avez installé incron, vous pouvez ajouter quelque chose comme ceci à l'incrontab :

/etc/cluster.cf IN_MODIFY /path/to/your/script

En disant que chaque fois que /etc/cluster.cf est modifié, exécutez votre script. voir man 5 incrontab y man 1 incrontab

0 votes

Oui, mais qui va garder cron ?

1voto

Aaron Copley Points 12225

En supposant que vous utilisez une distribution SysV, créez un script d'initialisation et placez-le dans /etc/init.d.

Regardez n'importe lequel des scripts qui sont déjà là pour des exemples de la façon de formater ce scripts. Considérez ceux qui utilisent la fonction daemon. Vous utiliseriez alors chkconfig pour permettre au script de s'exécuter au démarrage. Cette initialisation script devrait écrire son PID dans un fichier de verrouillage. Vous aurez besoin d'un second 'processus auxiliaire' pour vérifier le PID du premier en lisant le fichier de verrouillage et déterminer s'il est en cours d'exécution ou non. Incluez une logique pour détruire le verrou et redémarrer le premier processus s'il ne trouve pas de PID en cours d'exécution.

0voto

yrk Points 2307

Il existe une chose dont le seul travail est de (re)démarrer d'autres choses, elle s'appelle init et il est configuré par inittab . Pour rendre quelque chose vraiment immortel, ajoutez-le à inittab avec respawn option.

Un simple vérificateur script (un candidat à l'emploi de inittab ) pourrait être comme ceci :

while :
do
     grep -q machineA_is_active /etc/cluster.cf && activation_script
     # here one needs to ensure the above wan't fire again
     # - say, by carelessly wiping off /etc/cluster.cf
     # or carefully editing out the triggering record
     sleep $delay
done

0voto

tony gil Points 289

Une solution très simple (pas la plus élégante) pour un chien de garde est de créer une tâche cron qui exécute un service qui vérifie l'état d'un autre service.

sudo crontab -e

puis mettez cette ligne à la fin de votre fichier crontab (attention ceci va s'exécuter toutes les minutes de chaque jour jusqu'à ce que vous changiez à nouveau la crontab)

* * * * * /usr/sbin/sample_service

puis CTRL-X, Y, ENTER et redémarrez votre machine.

voici un exemple d'un tel service :

    #!/bin/bash
    #
    # watchdog
    #
    # Run as a cron job to keep an eye on what_to_monitor which should always
    # be running. Restart what_to_monitor and send notification as needed.
    #
    # This needs to be run as root or a user that can start system services.
    #
    # Revisions: 0.1 (20100506), 0.2 (20100507)

    NAME=sample_service
    NAME2=sample_service2
    START=/usr/sbin/$NAME
    START2=/usr/sbin/$NAME2
    NOTIFY=joe@gmail.com
    NOTIFYCC=jim@mail.com
    GREP=/bin/grep
    PS=/bin/ps
    NOP=/bin/true
    DATE=/bin/date
    # MAIL=/bin/mail
    RM=/bin/rm

    $PS -ef|$GREP -v grep|$GREP $NAME >/dev/null 2>&1
    case "$?" in
     0)
     # It is running in this case so we do nothing.
      echo "$NAME is RUNNING OK. Relax."

     $NOP
     ;;
     1)
     echo "$NAME is NOT RUNNING. Starting $NAME and sending notices."
     $START 2>&1 >/dev/null &
     NOTICE=/tmp/watchdog.txt
     echo "$NAME was not running and was started on `$DATE`" > $NOTICE
     # $MAIL -n -s "watchdog notice" -c $NOTIFYCC $NOTIFY < $NOTICE
     $RM -f $NOTICE
     ;;
    esac

     # GT06
    $PS -ef|$GREP -v grep|$GREP $NAME2 >/dev/null 2>&1
    case "$?" in
     0)
     # It is running in this case so we do nothing.
      echo "$NAME2 is RUNNING OK. Relax."

     $NOP
     ;;
     1)
     echo "$NAME2 is NOT RUNNING. Starting $NAME2 and sending notices."
     $START2 2>&1 >/dev/null &
     NOTICE=/tmp/watchdog.txt
     echo "$NAME2 was not running and was started on `$DATE`" > $NOTICE
     # $MAIL -n -s "watchdog notice" -c $NOTIFYCC $NOTIFY < $NOTICE
     $RM -f $NOTICE
     ;;
    esac

    exit

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