44 votes

Comment redémarrer automatiquement un processus en arrière-plan Linux en cas d'échec ?

J'ai un processus qui est exécuté par un script init.d en arrière-plan. Par exemple:

case "$1" in 
    start)
       /bin/myprocess &
    stop)
       killall myprocess
    restart)
       killall myprocess
       /bin/myprocess &
esac

Dans certaines conditions, mon processus peut échouer et renvoyer une erreur. Existe-t-il un moyen (standard) de détecter son échec et de le redémarrer automatiquement?

33voto

JdeBP Points 25711

Buildroot a trois systèmes d'initialisation possibles, donc il existe trois façons de le faire:

BusyBox init

Avec cela, on ajoute une entrée à /etc/inittab.

::respawn:/bin/myprocess

Notez que BusyBox init a un format /etc/inittab idiosyncratique. Le deuxième champ est sans importance, et le premier champ n'est pas un ID mais un nom de dispositif.

Linux "System V" init

Encore une fois, on ajoute une entrée à /etc/inittab.

myprocess:2345:respawn:/bin/myprocess

systemd

On écrit un fichier d'unité dans, par exemple, /etc/systemd/system/myprocess.service:

[Unit]
Description=Mon Processus

[Service]
ExecStart=/bin/myprocess
Restart=always

[Install]
WantedBy=multi-user.target

Activer ceci pour le démarrage automatique au démarrage avec:

systemctl enable myprocess.service

Démarrez-le manuellement avec:

systemctl start myprocess.service

Lecture complémentaire

28voto

rmc47 Points 453

Que diriez-vous de créer un sous-shell avec une boucle qui appelle constamment le même processus?

Si cela se termine, la prochaine itération de la boucle continue et le redémarre.

(while true; do 
    /bin/myprocess
done) &

Si le sous-shell meurt, c'est fini. La seule possibilité dans ce cas serait de créer un autre processus (que j'appellerai nécromancien) qui vérifie si votre processus est en vie, le démarre s'il ne l'est pas et exécute ce nécromancien avec cron, afin que vous puissiez vérifier régulièrement.

La prochaine étape consisterait à se demander ce qui se passerait si cron mourait, mais à un moment donné, vous devriez vous sentir en sécurité et cesser de vous inquiéter.

17voto

Alan Shutko Points 4028

La manière la plus simple serait de l'ajouter à /etc/inittab, qui est conçu pour ce genre de choses :

respawn Si le processus n'existe pas, lancez le processus. N'attendez pas sa terminaison (continuez à scanner le fichier /etc/inittab). Redémarrez le processus lorsqu'il meurt. Si le processus existe, ne faites rien et continuez à scanner le fichier /etc/inittab.

Par exemple, vous pourriez faire ceci :

# Exécutez mes trucs
myprocess:2345:respawn:/bin/myprocess

4voto

Clyde D'Cruz Points 141

Vous pourriez utiliser Monit. C'est vraiment facile à utiliser et assez flexible. Voyez par exemple cette configuration pour redémarrer le processus Tomcat en cas d'échec.

check process tomcat with pidfile /var/run/tomcat.pid
   start program = "/etc/init.d/tomcat start"
   stop  program = "/etc/init.d/tomcat stop"
   if failed port 8080 type tcp then restart

Il propose également de nombreux exemples de configuration pour de nombreux cas d'utilisation.

1voto

sivann Points 161

Vous pouvez utiliser restarter

start)
   restarter -c /bin/myprocess &
stop)
   pkill -f myprocess

Sur les nouveaux systèmes, utilisez systemd qui résout tous ces problèmes triviaux

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