web-dev-qa-db-fra.com

Norme ou meilleure façon de garder le processus vivant commencé par init.d

Je cherche une manière standard ou une meilleure pratique pour garder un démon commencé par un init.d Script shell en vie.

Ou même mieux, y a-t-il un moyen de le garder en vie directement de /etc/init.d?

Spécifiquement, j'ai un démon appelé DTND avec et une boucle infinie qui recherche un processus final inattendu, s'il y en a un, le démon les réveille à nouveau. De plus, j'utilise l'outil Start-STOP-DAION afin de laisser le précision effectué par un utilisateur système donné.

Je veux exécuter ce démon DTND du démarrage. Pour atteindre ce comportement, j'ai créé un script init.d qui "enveloppe" le fichier DTND à l'aide des commandes de démarrage, d'arrêt et d'état.

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

  1. Y a-t-il un moyen d'atteindre garder en vie un processus d'init.d Script shell. Est une pratique standard/meilleur?

  2. Il est recommandé de garder un processus vivant avec une boucle infinie? Je suppose qu'il est préférable d'utiliser une commande comme respawn pour atteindre cela. C'est correct?

Je connais l'existence de la commande respawn. 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 pas l'inittab ni l'UPSTART (je n'ai autorisé à utiliser que /etc/init, /etc/init.d, cron et outils système comme start-stop-daemon. Je veux dire, seuls les outils par défaut)

Merci beaucoup pour votre temps!

14
Adrian Antunez

Debian aura éventuellement SystemD. C'est donc le moyen de le faire sur un système Linux qui utilise SystemD (et beaucoup font déjà; vous pourriez envisager de changer de distribution).

SystemD peut gérer la conservation du service en vie pour vous automatiquement; Aucun autre outil n'est requis. Assurez-vous simplement que Restart=always est défini dans le fichier de service [Service] section.

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

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

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

13
Michael Hampton

Vous pouvez l'ajouter à /etc/inittab avec 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 systèmes plus anciens Sysv-Init.

3
Dennis Kaarsemaker

C'est une des raisons principales, c'est pourquoi Debian passe à SystemD.

sysvinit (/etc/init.d) n'est pas capable 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 fera plus son travail.

probablement la chose la plus facile à faire serait de migrer vers un autre Daemonhandler comme SystemD (par défaut dans RHEL7, sera par défaut dans les prochains-éléments debian et Ubuntu LTS), UPStart (par défaut dans RHEL6, Ubuntu 12.04 et 14.04), Daemontools (comme mentionné, Dévélopé par DJB) ou autre chose.

faire le travail de garder un service vivant sera pita dans Sysvinit.

2
janaurka

La meilleure pratique consiste à garantir que vos démons ne s'arrêtent pas en premier lieu.

À défaut de vouloir jeter un coup d'œil à DJB Daemontools

1
symcbean

L'approche standard pour moi est d'utiliser le tilitaire monit pour cela.

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

1
ewwhite