Évitez les fichiers PID, les crons ou tout autre élément qui tente d'évaluer des processus qui ne sont pas leurs enfants.
Il y a une très bonne raison pour laquelle sous UNIX, vous ne pouvez attendre que vos enfants. Toute méthode (analyse ps, pgrep, stockage d'un PID, ...) qui essaie de contourner ce problème est défectueuse et comporte des trous béants. Dites simplement non .
Au lieu de cela, vous avez besoin du processus qui surveille votre processus pour être le parent du processus. Qu'est-ce que ça veut dire? Cela signifie que seul le processus qui démarre votre processus peut attendre de manière fiable qu'il se termine. En bash, c'est absolument trivial.
until myserver; do
echo "Server 'myserver' crashed with exit code $?. Respawning.." >&2
sleep 1
done
Le morceau de code bash ci-dessus s'exécute myserver
en until
boucle. La première ligne démarre myserver
et attend qu'elle se termine. Une fois terminé, until
vérifie son état de sortie. Si l'état de sortie est 0
, cela signifie qu'il s'est terminé avec élégance (ce qui signifie que vous lui avez demandé de s'arrêter d'une manière ou d'une autre, et il l'a fait avec succès). Dans ce cas, nous ne voulons pas le redémarrer (nous venons de lui demander de s'arrêter!). Si l'état de sortie n'est pas 0
, until
exécutera le corps de la boucle, qui émet un message d'erreur sur STDERR et redémarre la boucle (retour à la ligne 1) après 1 seconde .
Pourquoi attendons-nous une seconde? Parce que si quelque chose ne va pas avec la séquence de démarrage de myserver
et qu'elle se bloque immédiatement, vous aurez une boucle très intensive de redémarrage et de plantage constant entre vos mains. Le sleep 1
enlève la souche à partir de cela.
Maintenant, tout ce que vous devez faire est de démarrer ce script bash (de manière asynchrone, probablement), et il le surveillera myserver
et le redémarrera si nécessaire. Si vous souhaitez démarrer le moniteur au démarrage (pour que le serveur "survienne" aux redémarrages), vous pouvez le planifier dans le cron (1) de votre utilisateur avec une @reboot
règle. Ouvrez vos règles cron avec crontab
:
crontab -e
Ajoutez ensuite une règle pour démarrer votre script de moniteur:
@reboot /usr/local/bin/myservermonitor
Alternativement; regardez inittab (5) et / etc / inittab. Vous pouvez y ajouter une ligne pour myserver
commencer à un certain niveau d'initialisation et être réapparu automatiquement.
Éditer.
Permettez-moi d'ajouter quelques informations sur pourquoi ne pas utiliser les fichiers PID. Bien qu'ils soient très populaires; ils sont également très imparfaits et il n'y a aucune raison pour que vous ne le fassiez pas simplement de la bonne façon.
Considère ceci:
Recyclage PID (tuant le mauvais processus):
/etc/init.d/foo start
: démarrer foo
, écrire foo
le PID de/var/run/foo.pid
- Un peu plus tard:
foo
meurt en quelque sorte.
- Un peu plus tard: tout processus aléatoire qui démarre (appelez-le
bar
) prend un PID aléatoire, imaginez qu'il prenne foo
l'ancien PID.
- Vous remarquez que c'est
foo
parti: /etc/init.d/foo/restart
lit /var/run/foo.pid
, vérifie pour voir s'il est toujours vivant, trouve bar
, pense que c'est foo
, tue, commence un nouveau foo
.
Les fichiers PID deviennent périmés. Vous avez besoin d'une logique trop compliquée (ou devrais-je dire, non triviale) pour vérifier si le fichier PID est périmé, et une telle logique est à nouveau vulnérable 1.
.
Et si vous n'avez même pas accès en écriture ou si vous êtes dans un environnement en lecture seule?
C'est une surcompensation inutile; voyez à quel point mon exemple ci-dessus est simple. Pas besoin de compliquer ça du tout.
Voir aussi: Les fichiers PID sont-ils toujours défectueux lorsqu'ils le font «correctement»?
Au fait; pire encore que l'analyse des fichiers PID ps
! Ne fais jamais ça.
ps
est très impraticable. Bien que vous le trouviez sur presque tous les systèmes UNIX; ses arguments varient considérablement si vous souhaitez une sortie non standard. Et la sortie standard est UNIQUEMENT pour la consommation humaine, pas pour l'analyse par script!
- L'analyse
ps
conduit à BEAUCOUP de faux positifs. Prenons l' ps aux | grep PID
exemple, et imaginez maintenant que quelqu'un démarre un processus avec un nombre quelque part comme argument qui se trouve être le même que le PID avec lequel vous avez regardé votre démon! Imaginez deux personnes qui démarrent une session X et vous attendez que X tue la vôtre. C'est juste toutes sortes de mauvais.
Si vous ne voulez pas gérer le processus vous-même; il existe des systèmes parfaitement bons qui serviront de moniteur pour vos processus. Regardez runit , par exemple.