Processus standard ou le meilleur moyen de maintenir en vie démarré par init.d

14

Je recherche une méthode standard ou une meilleure pratique pour maintenir en vie un démon démarré par un init.dscript shell.

Ou encore mieux, existe-t-il un moyen de le garder en vie directement /etc/init.d?

Plus précisément, j'ai un démon appelé dtnd avec et boucle infinie qui recherche un processus terminé inattendu, s'il y en a un, le démon les réveille à nouveau. En outre, j'utilise l'outil start-stop-daemon afin de laisser la précession s'exécuter à partir d'un utilisateur système donné.

Je veux exécuter ce démon dtnd à partir du démarrage. Afin d'obtenir ce comportement, j'ai créé un script init.d qui "enveloppe" le fichier dtnd à l'aide des commandes start, stop et status.

J'ai 2 questions que j'aimerais résoudre:

  1. Existe-t-il un moyen de maintenir en vie certains processus du script shell init.d. Est-ce une pratique standard / meilleure?

  2. Il est recommandé de garder un processus vivant avec une boucle infinie? Je suppose qu'il vaut mieux utiliser une commande comme respawnpour y parvenir. C'est correct?

Je connais l'existence du respawncommandement. Je pense que c'est ce dont j'ai besoin mais je ne comprends pas le flux de travail entre /etc/init.d/et /etc/init. Quelqu'un peut-il m'aider?

Notez que je n'ai inittab ni arriviste (je suis autorisé à utiliser /etc/init, /etc/init.d, cronet des outils système comme start-stop-daemon. Je veux dire, seuls les outils par défaut)

Merci beaucoup pour votre temps!

Adrian Antunez
la source

Réponses:

13

Debian finira par avoir systemd, c'est donc la façon de le faire sur un système Linux qui utilise systemd (et beaucoup le font déjà; vous pourriez envisager de changer de distribution).

Systemd peut gérer la maintenance du service automatiquement pour vous; aucun autre outil n'est requis. Assurez-vous simplement que cela Restart=alwaysest défini dans la [Service]section du fichier de service .

# vi /etc/systemd/system/dtnd.service

[Service]
Restart=always
#...everything else...

Plusieurs autres options sont également disponibles, pour des scénarios plus complexes.

Michael Hampton
la source
2
Bien que l'avenir montre des options plus flexibles, cela prend-il en compte l'environnement / les conditions actuelles? L'installation d'un outil semble être la voie de la moindre résistance par rapport à un changement / mise à niveau de la distribution d'un chariot élévateur.
ewwhite
@ewwhite Cela dépend. Debian a systemd depuis Wheezy, mais ce n'était pas l'init par défaut. Ce devrait être la valeur par défaut de Jessie. Et puisque notre utilisateur a accepté la réponse, je suppose qu'il utilisait déjà systemd pour une autre raison (ou avait la permission de l'installer).
Michael Hampton
systemdsemble se défaire du init.dscript et de la base*.service
yurenchen
2
Au lieu de modifier directement, utilisez le plus sûr systemctl edit myservice, puis systemctl daemon-reloadredémarrez myservice.
Pablo A
@PabloBianchi La création d'un remplacement est très bien si vous remplacez l'unité d'un service existant. Si vous créez une unité à partir de zéro, comme l'OP l'a fait, alors c'est inutile.
Michael Hampton
3

Vous pouvez l'ajouter à /etc/inittabavec respawn:

d1:2345:respawn:/path/to/your/first_daemon arg1 arg2
d2:2345:respawn:/path/to/your/second_daemon arg1 arg2

C'est un hack sale, mais je l'ai utilisé avec succès dans le passé sur les anciens systèmes sysv-init.

Dennis Kaarsemaker
la source
Mais les démons ne calent-ils généralement pas setsid () et fork () pour s'exécuter en arrière-plan?
symcbean
Je vous remercie! Comme vous le dites, c'est un hack sale mais ça marche. Quoi qu'il en soit, je préfère l'utilisation de systemd. Maintenant je connais son existence.
Adrian Antunez
Cela ne fonctionne pas sur RHEL6. L'utilitaire de réapparition ne semble pas être disponible.
Djidiouf
2

Eh bien, c'est l'une des principales raisons pour lesquelles Debian passe à systemd.

sysvinit (/etc/init.d) n'est pas en mesure de détecter si un service est en panne / ne répond pas. Cela signifie que vous devez surveiller ces services et escalader si un service ne fait plus son travail.

la chose la plus simple à faire serait probablement de migrer vers un autre gestionnaire de démons comme systemd (par défaut dans RHEL7, sera par défaut dans les prochains debian et ubuntu lts), upstart (par défaut dans RHEL6, Ubuntu 12.04 et 14.04), daemontools (comme mentionné, développé par djb) ou autre chose.

faire le travail de maintenir un service en vie sera PITA in sysvinit.

janaurka
la source
1

La meilleure pratique consiste à s'assurer que vos démons NE S'ARRÊTENT PAS en premier lieu.

À défaut, vous voudrez peut-être jeter un œil aux daemontools de DJB

symcbean
la source
3
Bien sûr, la meilleure pratique consiste à s'assurer que mes démons ne s'arrêtent pas. Mais il y a beaucoup d'applications qui suivent l'approche if-I-stop-wake-me comme apache2, mysql, samba, pulseaudio ... J'ai cherché daemontools et semble une bonne approche. Malheureusement, je ne suis pas autorisé à installer des outils externes. J'ai besoin de le faire en utilisant les scripts bash ou les configs start-stop-daemon et init.d.
Adrian Antunez
1

L'approche standard pour moi est d'utiliser l' utilitaire Monit pour cela.

Je ne peux pas vraiment dire à partir de votre description si vous avez écrit quelque chose comme Monit et essayez de vous assurer qu'il fonctionne, ou si vous avez besoin de quelque chose pour regarder le démon que vous avez créé.

ewwhite
la source
1
Salut ewwhite, je dois m'assurer que mon application fonctionne. Malheureusement, je ne suis pas autorisé à installer des outils externes. J'ai besoin de le faire en utilisant les scripts bash ou les configs start-stop-daemon et init.d.
Adrian Antunez
2
@ AdriánAntúnez Si vous n'êtes pas autorisé à installer les outils dont vous avez besoin pour faire votre travail, vous devez résoudre ce problème dès que possible.
Michael Hampton
@ AdriánAntúnez Vous avez demandé "standard". Monit est assez bien connu / bien considéré. Vous avez demandé "le meilleur" ... Votre contrainte est davantage d'ordre politique. Pourquoi ne seriez-vous pas autorisé à installer des logiciels?
ewwhite
1
Ce n'est pas un outil ou une dépendance inutile s'il fait ce que vous voulez qu'il fasse .
ewwhite
1
@ewwhite Désolé, je voulais éviter les dépendances d'outils externes.
Adrian Antunez