Devenir un démon
Ce lien a une bonne liste des étapes d'un processus devrait prendre pour devenir un démon: http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16
Je ne peux pas copier la liste in extenso en raison du droit d'auteur (voir a propos de la section), mais voici le résumé:
fork
(première fois) - donc nous ne sommes pas un chef de groupe, et que la sortie de parent.
- appel
setsid()
- pour devenir le leader d'une nouvelle session. Cet appel ne fonctionne que si nous ne sommes pas un chef de groupe. Cette nouvelle session n'a pas de terminal de contrôle. (Seconde fois) - nous ne sommes donc pas un leader de session (et donc ne pouvons pas retrouver un terminal de contrôle), et laissons le parent sortir.
cd
au répertoire racine - afin que nous n'empêchions pas d'autres répertoires d'être démontés.
- définir
umask
à la valeur désirée (facultatif) - parce que nous aurions pu hériter d'un masque que nous ne voulions pas.
- près stdin, stdout, stderr (ou tout simplement les rouvrir au point ailleurs)
nohup
Qu'est-ce nohup
fait:
- Si stdout et stderr sont reliées à une borne , les redirige vers
nohup.out
- ignore SIGHUP
Similitudes et différences
Remarquez comment les seules actions communes redirigez stdout et stderr. Être un démon ne nécessite même pas d'ignorer SIGHUP. '
nohup
ne nécessite pas d'utiliser' &
'pour mettre en arrière-plan le processus - ce qui signifie que vous pouvez toujours utiliser ctrl-c pour envoyer SIGINT. Le processus répond toujours à l'entrée au clavier. Il ne change pas automatiquement stdin, il est donc recommandé de le faire vous-même via "< /dev/null
".
Veuillez ne pas confondre nohup
avec d'autres caractéristiques normalement utilisées avec celui-ci (par exemple, l'arrière-plan). Le PO a spécifiquement demandé nohup
.
En pratique
En termes de pratique, lorsque vous voulez démarrer un processus de longue durée unique qui devrait se poursuivre lorsque les sorties de shell, vous aurez envie d'utiliser nohup
, mais vous veulent aussi le combiner avec backgrounding et redirection de stdin.Un travail ponctuel ne vaut pas la peine de créer un démon, mais certaines propriétés d'un démon peuvent toujours être utiles avec un travail nohup, comme "cd /
".
Les tâches périodiques sur un horaire régulier sont mieux exécutées via cron
(ou un autre planificateur). Les démons sont les mieux adaptés pour superviser des tâches répétées qui n'ont pas une heure de début prévisible. Il n'y a normalement pas d'heure de fin définie pour le processus démon (elle est explicitement arrêtée par un utilisateur/un autre processus ou par un arrêt du système). Souvent, les démons sont des services qui répondent aux applications (clients) ou à d'autres conditions (par exemple, les données entrantes via un périphérique IO via unix select()). D'autres démons interrogent une condition et exécutent une action en réponse.
Addendum au sujet terminal de contrôle
Voir this page. Un résumé rapide est qu'un terminal de contrôle accorde un accès illimité à son stdin, stdout, stderr. Un seul groupe de processus peut avoir accès à stdin. Par défaut, les groupes de processus d'arrière-plan peuvent également écrire dans stdout et stderr. En outre, il semble que les signaux de clavier envoyés à un terminal sont uniquement envoyés au groupe de processus qui en est le terminal de contrôle.
Vous ne savez pas pourquoi vous l'appelez pauvre. Il fait la bonne chose si vous voulez faire de votre processus un démon, à part qu'il ne se déconnecte pas du terminal de contrôle, ce qui, en pratique, n'a pas d'importance. Deuxièmement, vous l'appelez faux, la forme correcte est '(nohup sleep 20 &)', c'est-à-dire que parens le déconnecte du chef de groupe de processus, afin qu'il ne reçoive pas de signaux pour ce groupe de processus. –
@MaximYegorushkin Les parens ne font aucune différence (autant que je puisse le voir). Exécuter un programme à partir d'un shell fait toujours de ce prog un chef de groupe. Essayez ceci et vous verrez que le PGID correspond toujours au PID: 'perl -e 'system" ps -fjp $$ "''. En outre, l'esperluette n'est pas inhérente à nohup, donc même c'est une différence entre nohup et démon. Je vais ajouter ma propre réponse avec encore plus de différences. – Kelvin
@Kelvin: Les parenthèses dans '(nohup sleep 20 &)' font vraiment la différence. Ils spécifient un sous-shell. À l'intérieur du sous-shell, la commande 'nohup' exécute la commande' sleep' en arrière-plan. Quand il revient, le sous-shell se ferme, donc 'sleep' est orphelin, n'est plus 'possédé' par le shell actuel. –