J'écris un démon Linux. J'ai trouvé deux façons de le faire.
fork()
et en définissant sid
.&
.Quelle est la bonne façon de procéder?
De http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16
Voici les étapes pour devenir un démon:
- fork () pour que le parent puisse quitter, cela renvoie le contrôle à la ligne de commande ou au shell appelant votre programme. Cette étape est nécessaire pour garantir que le nouveau processus ne soit pas un chef de groupe de processus. L'étape suivante, setsid (), échoue si vous êtes un chef de groupe de processus.
- setsid () pour devenir un chef de groupe de processus et de groupe de session. Puisqu'un terminal de contrôle est associé à une session, et cette nouvelle session n'a pas encore acquis de terminal de contrôle, notre processus n'a plus de terminal de contrôle, ce qui est une bonne chose pour les démons.
- fork () pour que le parent (le chef du groupe de session) puisse quitter. Cela signifie que nous, en tant que chef de groupe non-session, ne pouvons jamais retrouver un terminal de contrôle.
- chdir ("/") pour nous assurer que notre processus ne conserve aucun répertoire en cours d'utilisation. Si vous ne le faites pas, cela pourrait empêcher un administrateur de démonter un système de fichiers, car il s'agit de notre répertoire actuel. [De manière équivalente, nous pourrions passer à n'importe quel répertoire contenant des fichiers importants pour le fonctionnement du démon.]
- umask (0) afin que nous ayons un contrôle complet sur les autorisations de tout ce que nous écrivons. Nous ne savons pas de quel umask nous pouvons avoir hérité. [Cette étape est facultative]
- close () fds 0, 1 et 2. Cela libère la norme in, out et l'erreur que nous avons héritée de notre processus parent. Nous n'avons aucun moyen de savoir où ces fichiers peuvent avoir été redirigés. Notez que de nombreux démons utilisent sysconf () pour déterminer la limite _SC_OPEN_MAX. _SC_OPEN_MAX vous indique les fichiers/processus ouverts maximun. Puis en boucle, le démon peut fermer tous les descripteurs de fichiers possibles. Vous devez décider si vous devez le faire ou non. Si vous pensez qu'il peut y avoir des descripteurs de fichiers ouverts, vous devez les fermer, car le nombre de descripteurs de fichiers simultanés est limité.
- Établir de nouveaux descripteurs ouverts pour stdin, stdout et stderr. Même si vous n'envisagez pas de les utiliser, c'est toujours une bonne idée de les ouvrir. La manipulation précise de ceux-ci est une question de goût; si vous avez un fichier journal, par exemple, vous souhaiterez peut-être l'ouvrir en tant que stdout ou stderr, et ouvrir '/ dev/null' en tant que stdin; vous pouvez également ouvrir '/ dev/console' en tant que stderr et/ou stdout, et '/ dev/null' en tant que stdin, ou toute autre combinaison qui a du sens pour votre démon particulier.
Mieux encore, appelez simplement la fonction daemon () si elle est disponible.
Je suggère de ne pas écrire du tout votre programme en tant que démon. Faites-le s'exécuter au premier plan avec les descripteurs de fichiers, le répertoire courant, le groupe de processus, etc. qui lui sont attribués.
Si vous souhaitez ensuite exécuter ce programme en tant que démon, utilisez start-stop-daemon (8), init (8), runsv (from runit), upstart, systemd, ou quoi que ce soit pour lancer votre processus en tant que démon. Autrement dit, laissez votre utilisateur décider comment exécuter votre programme et n'appliquez pas qu'il doit s'exécuter en tant que démon.
Utilisez simplement daemon(3)
(à partir de unistd.h
).
La fonction daemon () est destinée aux programmes souhaitant se détacher du terminal de contrôle et s'exécuter en arrière-plan en tant que démons système. ...
La première. La seconde n'est pas démonétisation, mais s'exécute en arrière-plan. Les programmes démonisés devraient être sur leur propre session et groupe de processus, et devraient pas avoir un terminal de contrôle.
Quelle langue utilisez-vous? Certaines langues ont des méthodes d'assistance qui facilitent la démonisation. Par exemple, Ruby a le paquet daemons .
En fait, pour créer un démon, vous devez doubler fork.
L'exécution du programme avec a & oblige Shell à exécuter le programme en arrière-plan, ce qui n'en fait pas un démon. Les démons ont init (pid 1) en tant que parent, c'est pourquoi le double fork est nécessaire.
Donc, la bonne façon de faire les choses, si votre programme est un démon, serait de vous occuper de ce problème vous-même (il existe d'autres méthodes, voir ici aussi). Vous pouvez également utiliser le programme start-stop-daemon.