web-dev-qa-db-fra.com

Quelle est la différence entre l'exécution d'un programme en tant que démon et la fourrage en arrière-plan avec '&'?

Quelles sont les différences pratiques d'un point de vue sysadmin lors du déploiement de services sur un système basé sur UNIX?

46
user1561108

La manière traditionnelle de démonisation est la suivante:

fork()
setsid()
close(0) /* and /dev/null as fd 0, 1 and 2 */
close(1)
close(2)
fork()

Cela garantit que le processus n'est plus dans le même groupe de processus que le terminal et ne sera donc jamais tué avec elle. Le IO redirection est de rendre la sortie n'apparaît pas sur le terminal.

30
Dennis Kaarsemaker

Pour un démon, ce que vous voulez, c'est un processus qui n'a aucune cravate à rien. À tout le moins, vous voulez que ce soit dans sa propre session, ne soit pas attaché à un terminal, aucun descripteur de fichiers hérité du parent ouvert à quoi que ce soit, ne disposez pas d'un parent attentionné pour vous (autre que INIT). Répertoire dans / afin de ne pas empêcher une utille ...

Pour détacher à partir d'un terminal, vous créez une nouvelle session, cependant, pour créer une session, vous ne devez pas être un chef de groupe (ou de session), le mieux est de rechercher un nouveau processus. En supposant que les sorties des parents, cela signifie également que le processus n'aura plus de parent et sera adopté par init. Ensuite, fermez tous les descripteurs de fichier possibles, vous chdir("/") (on ne peut pas Fermer Le répertoire de travail actuel pour libérer cette ressource comme pour les descripteurs de fichier, rendant / Le Les répertoires de travail actuels n'empêchent pas au moins les répertoires de démontage).

Parce que ce processus est un chef de session, il y a un risque que, si cela ouvre un terminal, il devient le processus de contrôle de ce terminal. Forking une seconde fois garantit que cela n'arrive pas.

À l'autre bout, et, dans des coquilles interactifs, fourchettes et crée un nouveau groupe de processus (afin de ne pas être dans le groupe de processus de premier plan du terminal), et dans des coquilles non interactives, fourche un processus et ignore SIGINT. Il ne détache pas du terminal, ne ferme pas les descripteurs de fichiers (bien que certaines coquilles rouvrent STDIN à /dev/null) ...

35
Stéphane Chazelas

La différence entre la gestion d'un programme/processus en tant que démon et la fourrant à l'arrière-plan à l'aide de l'ampersand est essentiellement liée à la propriété.

Le plus souvent, le processus parent d'un démon est le processus init (le tout premier processus à démarrer sur un système UNIX), le démon étant un enfant de ce processus signifie qu'il n'est pas sous votre Direct. Contrôlez en tant qu'utilisateur non privilégié. Bien que, d'autre part, faire la fourchette d'un programme/processus à l'arrière-plan signifie que vous pouvez à tout moment, rappelez-le au premier plan et/ou le tuer.

9
Odaym

Avec command & Votre processus sera tué par un signal de soupiculture lorsque le parent meurt.

Les Sysadmins ont cependant accès à des solutions de contournement.

Sur un système Bash, vous pouvez utiliser:

(trap '' HUP; command) &

Cela ouvre un sous-vase, piège le signal HUP avec un gestionnaire vide et son ampersand/fourche.

La sortie peut encore être redirigée vers le mauvais tty. Ou se perdre.
[.____] Vous pouvez résoudre ce problème avec &>command.out, 1>output.out, ou 2>errors.out

Vous avez peut-être également accès, sur la plupart des systèmes, à la commande Nohup.
[.____] Nohup simplifie considérablement ce processus. C'est assez standard, mais j'ai trouvé beaucoup d'achabus intégré ARM Distributions manquait. Vous venez d'écrire:

Nohup command &

..et tu as fini. La sortie est redirigée, IIRC, à Nohup.out, mais ce nom de fichier peut être modifié avec une option.

7
ZJR