Éviter PID-files, crons, ou quoi que ce soit d'autre qui tente d'évaluer les processus qui ne sont pas leurs enfants.
Il ya une très bonne raison pour laquelle, dans UNIX, vous ne pouvez attendre de vos enfants. Toute méthode (ps de l'analyse, pgrep, le stockage d'un PID, ...) qui essaie de contourner qui est défectueux et a des trous béants. Juste dire non.
Vous devez plutôt le processus qui surveille votre processus d'être le processus' parent. Qu'est-ce que cela signifie? Cela signifie que le processus qui démarre votre processus fiable d'attente pour elle à la fin. En bash, c'est absolument insignifiant.
until myserver; do
echo "Server 'myserver' crashed with exit code $?. Respawning.." >&2
sleep 1
done
La pièce ci-dessus de bash code s'exécute myserver
en until
boucle. La première ligne commence myserver
et l'attend à la fin. Quand elle se termine, until
vérifie son état de sortie. Si le statut de sortie est - 0
, cela signifie que c'est terminé normalement (ce qui signifie que vous avez demandé la fermeture d'une certaine manière, et il l'a fait avec tant de succès). Dans ce cas, nous ne voulons pas le redémarrer (nous avons demandé la fermeture!). Si le statut de sortie n'est pas 0
, until
va exécuter le corps de la boucle, qui émet un message d'erreur sur STDERR et de redémarrage de la boucle (retour à la ligne 1) après 1 seconde.
Pourquoi nous faire attendre une seconde? Parce que si quelque chose ne va pas avec la séquence de démarrage de l' myserver
et il se bloque immédiatement, vous aurez un très intensive de la boucle de la constante de redémarrer et de s'écraser sur vos mains. L' sleep 1
enlève de la souche.
Maintenant tout ce que vous devez faire est de commencer ce script bash (de manière asynchrone, sans doute), et il surveillera myserver
et de le redémarrer si nécessaire. Si vous souhaitez démarrer le moniteur de démarrage (serveur de "survivre" redémarre), vous pouvez programmer dans votre cron de l'utilisateur(1) avec un @reboot
règle. Ouvrez votre cron règles avec crontab
:
crontab -e
Puis ajouter une règle pour commencer votre script de surveillance:
@reboot /usr/local/bin/myservermonitor
Alternativement; regardez inittab(5) et /etc/inittab. Vous pouvez ajouter une ligne dans y ont myserver
commencer à un certain niveau d'init et de repop automatiquement.
Edit.
Permettez-moi d'ajouter quelques informations sur les raisons de ne pas utiliser les fichiers PID. Alors qu'ils sont très populaires, ils sont également très imparfaite et il n'ya aucune raison pourquoi vous ne serait pas juste de faire de la bonne façon.
Réfléchissez à ceci:
-
PID recyclage (en tuant le processus incorrect):
-
/etc/init.d/foo start
: début foo
, écrire foo
s'PID /var/run/foo.pid
- Un peu plus tard:
foo
meurt en quelque sorte.
- Un peu plus tard: tout processus aléatoire qui commence (appelons -
bar
) prend un hasard PID, l'imaginer en prenant foo
s'ancien PID.
- Vous remarquez
foo
's gone: /etc/init.d/foo/restart
lectures /var/run/foo.pid
, vérifie si il est encore en vie, conclut bar
, pense que c'est foo
,, il tue, commence un nouveau foo
.
Les fichiers PID rassir. Vous avez besoin plus compliqué (ou devrais-je dire, non-trivial) logique pour vérifier si le fichier PID est vicié, et une telle logique est de nouveau vulnérable à l' 1.
.
Que faire si vous n'avez même pas accès en écriture ou en lecture seule de l'environnement?
Il est inutile overcomplication; voir comment de simples mon exemple ci-dessus est. Pas besoin de compliquer que, à tous.
Par la route, encore pire que les fichiers PID est l'analyse ps
! Ne jamais faire cela.
-
ps
est très portables. Alors que vous trouver sur presque tous les systèmes UNIX; ses arguments varient grandement si vous voulez non-standard de sortie. Et la sortie standard est SEULEMENT pour la consommation humaine, pas de script d'analyse!
- Analyse
ps
conduit à BEAUCOUP de faux positifs. Prendre l' ps aux | grep PID
exemple, et maintenant, imaginez quelqu'un au début d'un processus avec un nombre quelque part que l'argument qui se trouve être le même que le PID que vous avez regardé votre démon! Imaginez deux personnes de démarrer une session X et vous grepping de X pour tuer les vôtres. C'est juste toutes sortes de mauvais.
Si vous ne voulez pas gérer le processus vous-même; il y a quelques parfaitement les systèmes de bons là-bas qui vont agir comme un moniteur pour votre processus. Regardez dans les runit, par exemple.