Démoniser un processus en shell?


9

http://linuxg.net/how-to-transform-a-process-into-a-daemon-in-linux-unix/ donne un exemple de démonétisation d'un processus en bash:

$ nohup firefox& &> /dev/null

Si je ne me trompe pas, la commande est la même que "nohup et background a process". Mais un démon n'est-il pas plus qu'un processus simple et d'arrière-plan?

Quelles étapes manquent ici pour démoniser un processus?

Par exemple, la modification du processus parent n'est-elle pas nécessaire lors de la démonétisation d'un processus? Si oui, comment faites-vous cela en bash? J'essaie toujours de comprendre une réponse connexe https://unix.stackexchange.com/a/177361/674 .

Quelles autres étapes et conditions?

Voir ma question connexe https://stackoverflow.com/q/35705451/156458


1
dépend de votre définition des démons. Si vous entendez simplement exécuter en arrière-plan détaché d'un terminal, alors oui, vous exécutez Firefox en tant que démon. les démons "standard", cependant, ne sont généralement pas exécutés par les utilisateurs, ont un script d'initialisation et une journalisation, et généralement une sorte de sécurité, souvent apparmor ou selinux selon que vous utilisez Ubuntu ou Fedora (ou similaire). Voir linfo.org/daemon.html .
Panther

1
Jetez un œil à start-stop-daemon Debian; Je vais laisser ici un fil de discussion de stack overflow stackoverflow.com/questions/16139940/… qui est plus intéressant que la page de manuel brute
Rui F Ribeiro

Réponses:


10

Extrait de l'article Wikipedia sur le démon :

Dans un environnement Unix, le processus parent d'un démon est souvent, mais pas toujours, le processus init. Un démon est généralement créé soit par un processus en forçant un processus enfant, puis en se fermant immédiatement, obligeant ainsi init à adopter le processus enfant, ou par le processus init qui lance directement le démon. En outre, un démon lancé en forçant et en quittant doit généralement effectuer d'autres opérations, telles que la dissociation du processus de tout terminal de contrôle (tty). Ces procédures sont souvent implémentées dans diverses routines de commodité telles que le démon (3) sous Unix.

Lisez la page de manuel de la daemonfonction.

L'exécution d'une commande d'arrière-plan à partir d'un shell qui se ferme immédiatement entraîne le PPID du processus devenant 1. Facile à tester:

# bash -c 'nohup sleep 10000 &>/dev/null & jobs -p %1'
1936
# ps -p 1936
      PID    PPID    PGID     WINPID   TTY         UID    STIME COMMAND
     1936       1    9104       9552  cons0       1009 17:28:12 /usr/bin/sleep

Comme vous pouvez le voir, le processus appartient au PID 1, mais est toujours associé à un ATS. Si je me déconnecte de ce shell de connexion, puis me reconnecter et psrecommencer, le TTY devient ?.

Lisez ici pourquoi il est important de se détacher des ATS .

Utilisation setsid(partie de util-linux):

# bash -c 'cd /; setsid sleep 10000 </dev/null &>/dev/null & jobs -p %1'
9864
# ps -p 9864
      PID    PPID    PGID     WINPID   TTY         UID    STIME COMMAND
     9864       1    9864       6632  ?           1009 17:40:35 /usr/bin/sleep

Je pense que vous n'avez même pas à rediriger stdin, stdout et stderr.


3
Jetez un œil à daemonize . Outre un bel outil, il a de très bonnes explications sur ce qu'est un démon.
Gene Pavlovsky

Je suis juste curieux de savoir si vous connaissez un moyen de dissocier le processus du tty sans vous déconnecter du shell à partir duquel le processus a été généré?
StoneThrow

1
@StoneThrow "sans vous déconnecter du shell à partir duquel le processus a été généré" Si vous utilisez le bash -cwrapper, aucun ATS n'est associé au processus. C'est vraiment comme il l'a démontré.
Bruno Bronosky

@StoneThrow mais faire ce test echo "outer tty: $(tty)"; ls -la $(dirname $(tty)); bash -c 'echo "inner tty: $(tty)"; ls -la $(dirname $(tty));'vous montrera que c'est exactement le même ATS pour les deux, mais le comportement démontré d'obtenir un ATS ?se produit toujours même si vous ne vous "déconnectez pas du shell" ni ne fermez le TTY.
Bruno Bronosky

-1

Un démon, de par son nom, n'est rien d'autre qu'un programme qui s'exécute jusqu'à 1. l'arrêt du système; 2. il est demandé d'arrêter. À part cela, cela n'a pas de sens magique.

Dans ces circonstances, l'exécution d'un script bash en arrière-plan avec nohup peut le classer comme un processus démon.

Qu'espérez-vous trouver et ne pas trouver? Si vous rencontrez des problèmes, veuillez les indiquer avec un exemple de code et des exemples de segments de données pour demander de l'aide. Votre question, telle qu'elle est actuellement, est trop large / générale.


Merci. Je pense que mon message a tout ce que vous avez demandé dans votre dernier paragraphe.
Tim

4
Umm ce n'est pas vrai. Un démon n'a pas de terminal de contrôle, n'a ni stdout ni stderr, et d'autres choses. Lire la première strophe de software.clapper.org/daemonize
Rich Homolka
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.