49 votes

Démonisation Linux

J'écris un démon Linux. J'ai trouvé deux façons de le faire.

  1. Démonisez votre processus en appelant fork et en définissant sid.
  2. Lancer votre programme avec &

Quelle est la bonne façon de le faire

82voto

nos Points 102226

À partir de http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16

Voici les étapes pour devenir un démon:

  1. fork() de sorte que le parent peut sortie, cela rend le contrôle de la ligne de commande shell ou de l'invocation de votre programme. Cette étape est nécessaire afin que le nouveau processus est garantie de ne pas être un processus de chef de groupe. La prochaine étape, setsid(), échoue si vous êtes un groupe de processus de leader.
  2. setsid() pour devenir un groupe de processus et de la session de chef de groupe. Depuis un terminal de contrôle est associée à une session, et cette nouvelle session n'a pas encore fait l'acquisition d'un terminal de contrôle de notre processus de maintenant n'a pas de terminal de contrôle, ce qui est une Bonne Chose pour les démons.
  3. fork() nouveau de sorte que le parent, (la session chef de groupe), peut quitter. Cela signifie que nous, en tant que non-session chef de groupe, ne peut jamais retrouver un terminal de contrôle.
  4. chdir("/") pour s'assurer que notre processus permet de ne pas garder tout le répertoire en cours d'utilisation. À défaut, cela pourrait faire en sorte qu'un administrateur ne pouvait pas démonter un système de fichiers, parce que c'était notre répertoire en cours. [De manière équivalente, on pouvait changer à n'importe quel répertoire contenant les fichiers importants pour le démon de l'opération.]
  5. umask(0), de sorte que nous avons un contrôle total sur les autorisations de tout ce que nous écrivons. Nous ne savons pas ce umask nous ont hérité. [Cette étape est facultative]
  6. close() fds 0, 1 et 2. Cela libère la norme, d'en sortir et d'erreur nous avons hérité de nos processus parent. Nous n'avons aucun moyen de savoir où ces fds pourriez être redirigé vers. Notez que de nombreux démons utilisation sysconf() pour déterminer la limite de _SC_OPEN_MAX. _SC_OPEN_MAX vous indique le nombre maximum de fichiers ouverts/processus. Puis dans une boucle, le démon peut fermer tous les possibles descripteurs de fichiers. Vous devez décider si vous avez besoin de le faire ou pas. Si vous pensez qu'il pourrait y avoir de fichiers descripteurs ouverte, vous devriez fermer, puisqu'il y a une limite sur le nombre de connexions simultanées descripteurs de fichiers.
  7. Établir de nouveaux descripteurs ouverts pour stdin, stdout et stderr. Même si vous ne prévoyez pas de l'utiliser, il est toujours une bonne idée de les faire ouvrir. La manipulation précise de ces est une question de goût; si vous avez un fichier de log, par exemple, vous pourriez souhaiter pour l'ouvrir en tant que stdout ou stderr, et ouvrir "/dev/null', comme stdin; sinon, vous pouvez ouvrir "/dev/console "comme stderr et/ou stdout, et "/dev/null', comme stdin, ou toute autre combinaison qui fait sens pour votre démon.

Mieux encore, il suffit d'appeler le démon() la fonction si elle est disponible.

30voto

camh Points 13169

Je suggère de ne pas écrire votre programme en tant que démon. Faites-le fonctionner au premier plan avec les descripteurs de fichier, le répertoire actuel, le groupe de processus, etc. tels que donnés.

Si vous souhaitez ensuite exécuter ce programme en tant que démon, utilisez start-stop-daemon (8), init (8), runsv (à partir de runit), upstart, systemd ou autre afin de lancer votre processus en tant que démon. En d’autres termes, laissez votre utilisateur décider du mode d’exécution de votre programme et ne lui imposez pas de s’exécuter en tant que démon.

12voto

jkramer Points 7271

Utilisez juste daemon (3) (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. ...

5voto

ninjalj Points 22026

La première. Le second n’est pas la démonisation, mais l’exécution en arrière-plan. Les programmes démonisés doivent se trouver sur leur propre session et groupe de processus et ne doivent pas avoir de terminal de contrôle.

2voto

Unknown Points 2067

En fait pour faire un démon que vous avez à double fourche.

L'exécution du programme avec un & rend la coquille 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 la double fourche est nécessaire.

Donc la bonne façon de faire les choses, si votre programme est un démon, serait de prendre soin de ce problème par vous-même (il y a plusieurs méthodes, voir ici aussi). Vous pouvez également utiliser la start-stop-daemon programme.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X