Comment puis-je redémarrer automatiquement un processus après sa fin?

11

J'ai un programme golang que je veux redémarrer après qu'il se termine sur une boîte Debian Squeeze. La chose est de servir HTTP derrière une configuration Apache 2 mod_proxy. Je ne m'attends pas à ce que le processus échoue, mais j'aimerais avoir une assurance contre cela.

Sur Ubuntu, j'aurais utilisé upstart pour maintenir le processus en vie. Debian n'aime pas Upstart d'après ce que je comprends car c'est un remplacement d'init.

Existe-t-il une alternative qui redémarre un ou plusieurs processus après leur fin qui fonctionne sur Squeeze et joue bien avec init?

Effacé
la source
Pourriez-vous reformuler votre question? Est-ce que vous voulez redémarrer un processus une fois terminé?
mailq
Je voudrais redémarrer un processus automatiquement s'il échoue ou se termine.
Supprimé
2
C'est précisément ce que fait le programme init traditionnel . Pourquoi les gens pensaient que ce serait une bonne idée d'utiliser init pour exécuter un script shell invoquant un script shell qui démarre un autre processus qui fait la même chose, mais sans panique automatique du noyau et redémarrage en cas d'échec de ce processus, cela me dépasse complètement.
Simon Richter
C'est un bon point. J'examinerai également en utilisant init. J'empaquette le logiciel à l'aide de dpkg, donc la création de scripts init ne devrait pas être une difficulté.
Supprimé

Réponses:

10

La meilleure façon de procéder est le daemontools. Ils vous permettent de surveiller et de réapparaître les processus.

Voir la documentation sur leur site Web: http://cr.yp.to/daemontools.html

mailq
la source
1
Merci - c'est juste ce que je recherche. DJB = bon en règle générale. J'aurais dû me souvenir qu'il existait quoi avec passer 5 ans à s'occuper de qmail!
Supprimé
Même chose avec moi, sauf que je m'occupais des djbdns depuis un certain temps.
mr.b
10

superviser est une alternative légère et efficace. Sous debian, il est empaqueté dans daemontools . Vous pouvez également lire cette question connexe , qui répertorie certaines critiques de supervision et mentionne redémarrer comme une autre possibilité.

Enfin, si vous voulez quelque chose d'incroyablement facile à configurer, j'ai eu beaucoup de succès avec monit . Il est également empaqueté dans Debian .

Francois G
la source
2
daemontools est génial; monit est un cauchemar effrayant de "pourquoi diable ne vas-tu pas commencer?!?" frustration.
womble
2

la supervision ou la surveillance sont utiles pour maintenir en vie un seul processus. Puisque vous demandez de garder "un ou plusieurs" processus en vie, je voudrais brancher supervisord . Il est certainement exagéré de gérer un seul processus, mais si vous devez suivre plusieurs processus, cela peut être votre truc.

Bittrance
la source
2

Une option consiste à utiliser /etc/inittabau lieu de mettre votre script dedans /etc/init.d/.

Vous ajoutez simplement une entrée au format suivant:

<jobname>:<runlevels>:respawn:<command>

Malheureusement, cela signifie que vous ne pouvez pas utiliser les commandes init normales de démarrage / arrêt / redémarrage, mais cela devrait garantir que votre script s'exécute tout le temps.

Alex
la source
2

La méthode de distribution croisée pour gérer les redémarrages du processus est avec cron et un script simple. Vous pouvez voir un résumé ici Comment maintenir un travail en cours d'exécution sous Linux

Le script ressemble à quelque chose

#!/bin/bash 
# make-run.sh 
# make sure a process is always running.  
# Add the following to the crontab (i.e. crontab -e)
# */5 * * * * /home/path_to_make_run/make-run.sh

process=servermonitoringhq 
makerun="/home/path_to_the_job_you_want_running/runjob.sh"  

if pgrep $process > /dev/null         
then                 
  exit         
else         
  $makerun &         
fi 
Ian Purton
la source