J'ai un processus qui est exécuté par le 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, myprocess peut échouer et revenir. Existe-t-il un moyen (standard) de détecter son échec et de redémarrer automatiquement?
Réponses:
Le moyen le plus simple serait de l'ajouter à / etc / inittab , qui est conçu pour faire ce genre de chose:
Par exemple, vous pouvez faire ceci:
la source
/etc/inittab
fonctionne (ou existe même) si et seulement si vous avez un système d'initialisation basé sur Sysvinit. Avec upstart et avec systemd, ce n'est pas le cas. Vous devez installer soit busybox (shell très primitif rendant les tâches de récupération de sysadm pénibles, mais il peut remplacer un initd compatible avec sysvinit) ou sysvinit (c'est un fossile). Dans un container docker, seul le premier n'est pas douloureux.Buildroot a trois systèmes d'initialisation possibles, il y a donc trois façons de procéder:
BusyBox
init
Avec cela, on ajoute une entrée à
/etc/inittab
.Notez que BusyBox
init
a un/etc/inittab
format idiosyncratique . Le deuxième champ n'a pas de sens et le premier champ n'est pas un ID mais un nom de base de périphérique.Linux "System V"
init
Encore une fois, on ajoute une entrée à
/etc/inittab
.systemd
On écrit un fichier unitaire dans, disons
/etc/systemd/system/myprocess.service
:Activez cette option pour démarrer automatiquement au démarrage avec:
Démarrez-le manuellement avec:
Lectures complémentaires
la source
service mything start
ouservice mything stop
plus .... est-il possible d'avoir le meilleur des deux? c'est-à-dire un service sysvinit non effaçable, mais aussi l'avoir utilisable via 'service'?Qu'en est-il de la création d'un sous-shell avec une boucle qui appelle constamment le même processus?
S'il se termine, l'itération suivante de la boucle continue et la redémarre.
Si le sous-shell meurt, c'est fini. La seule possibilité dans ce cas serait de créer un autre processus (je l'appellerai nécromancien) qui vérifie si votre processus est vivant, le démarre s'il ne l'est pas et exécute ce nécromancien avec cron, afin que vous puissiez le vérifier régulièrement.
La prochaine étape serait de se demander ce qui pourrait arriver si Cron meurt, mais à un moment donné, vous devriez vous sentir en sécurité et cesser de vous inquiéter.
la source
Vous pouvez utiliser Monit . C'est vraiment facile à utiliser et assez flexible. Voir par exemple cette configuration pour redémarrer le processus Tomcat en cas d'échec.
Il contient également de nombreux exemples de configuration pour de nombreux cas d'utilisation.
la source
Si vous n'êtes pas un super utilisateur ou un super-utilisateur, et si Docker est installé sur votre système Linux, vous pouvez créer une image docker de votre processus, en utilisant docker pour redémarrer votre processus si le système est redémarré.
Fichier: docker-compose.yml
Pour démarrer votre conteneur Docker,
Je trouve qu'il est facile de gérer mon propre processus avec un redémarrage automatique si je ne suis pas un super utilisateur du système.
Pour un exemple d'exemple de création d'une image Docker, voici un exemple rapide:
Fichier: Dockerfile
la source
Dans mon cas, comme solution rapide, j'ai modifié et utilisé la solution de @Trylks pour envelopper le programme que je lançais. Je voulais que cela se termine uniquement sur une sortie propre.
Devrait fonctionner dans la plupart des obus:
la source
Vous pouvez utiliser le redémarrage
Sur les systèmes plus récents, utilisez systemd qui résout tous ces problèmes triviaux
la source