Solution 1 :
Je regarderais dans daemontools (http://cr.yp.to/daemontools.html).
Supervise a été conçu exactement dans ce but :démarrer des processus et les surveiller, en les redémarrant immédiatement s'ils se terminent.
Vous pouvez toujours utiliser monit si vous avez besoin de faire quelque chose de plus compliqué qu'une simple vérification "est-ce qu'il est toujours en cours d'exécution", et si le processus doit être redémarré, faites-le via la supervision.
Solution 2 :
Vous pouvez également utiliser /etc/inittab pour redémarrer les processus morts en utilisant le respawn action.
Voir la section inittab sur http://aplawrence.com/Unixart/startup.html
Solution 3 :
Vous pouvez utiliser des scripts de gestionnaire d'événements avec Nagios si vous l'avez en place pour redémarrer les services.
Si le vernis nécessite une autorisation root pour démarrer (les scripts init.d le font généralement), remplacez "/etc/init.d/varnish start" par "sudo /etc/init.d/varnish start". Mais cela ne suffira probablement pas, car vous ne voulez probablement pas donner à l'utilisateur monit qui s'exécute en tant que privilèges sudo nopasswd totaux pour toutes les commandes et donner sudo à un script shell serait fondamentalement tout aussi mauvais. Vous devrez donc déterminer quelles commandes de ce script init ont besoin de sudo, donner à ces commandes les privilèges sudo dans le fichier /etc/sudoers à l'utilisateur monit, et enfin modifier ce script init en conséquence. Ou peut-être qu'au lieu de tout ce vernis peut être exécuté en tant qu'utilisateur non root ?
Enfin, je suis sûr que vous le savez, mais je vais le dire quand même. Vous mettez clairement beaucoup d'efforts là-dedans, j'espère que vous mettez autant d'efforts à comprendre pourquoi le vernis plante et à le réparer (ou à traquer les développeurs pour comprendre pourquoi) :-)
Mise à jour:
Ce n'est peut-être pas aussi propre, mais un moyen simple de le faire en tant que root pourrait être de configurer un script qui vérifie si le processus est correct, et sinon le démarre. Ensuite, exécutez simplement ce script toutes les deux minutes en tant que tâche cron.
Solution 4 :
Une autre excellente méthode tirée de StackOverflow :
until myserver; do
echo "Server 'myserver' crashed with exit code $?. Respawning.." >&2
sleep 1
done
Cela pourrait être ajouté à la crontab :
crontab -e
Ajoutez ensuite une règle pour démarrer votre script de surveillance :
@reboot /usr/local/bin/myservermonitor
Ou ajouté en tant que script dans /etc/init.d
Voir la réponse StackOverflow pour une explication détaillée de la raison pour laquelle il s'agit d'une bonne approche.