Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
837 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Comment faire un démon sous Linux/unix?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Comment faire un démon sous Linux/unix?

n°669985
kyo54
Posté le 10-03-2004 à 18:33:37  profilanswer
 

Bonjour.
 
J'ai fait un programme C mais je veux qu'il tourne en tant que démon sous Linux. Pour le lancement, il suffit de l'ajouter sans /etc/init.d/ . Mais comment mon programme doit-il être conçu pour tourner en tant que démon. J'ai cherché de la doc la-dessus mais sans succès. Et vous?


---------------
.
mood
Publicité
Posté le 10-03-2004 à 18:33:37  profilanswer
 

n°669990
Taz
bisounours-codeur
Posté le 10-03-2004 à 18:39:37  profilanswer
 

faut faire un double fork, changer l'id, rajouter un wait pour éviter un defunct, etc. voici un code en python
 

Code :
  1. def fork_exec_disown(cmd, rep):
  2.     try:
  3.         if os.fork()==0:
  4.             if os.fork():
  5.                 sys.exit(0)
  6.             os.chdir(os.path.expanduser(rep))
  7.             os.setsid()
  8.             os.umask(0)
  9.             cmd = cmd.split()
  10.             os.execvp(cmd[0], cmd)
  11.         os.wait()
  12.     except OSError, e:
  13.         print >>sys.stderr, \
  14.               "%s : Cannot change dir to '%s' and run '%s'" % (e, rep, cmd)


 
tu peux également éviter le double fork en manipulant le signal SIGCHLD de façon à ce que SA_NOCLDWAIT soit gérer par SIG_IGN


Message édité par Taz le 10-03-2004 à 18:42:21
n°669995
the real m​oins moins
Posté le 10-03-2004 à 18:46:12  profilanswer
 

c'est moi ou la plupart des trucs sous nux se font pas chier à tout ça et ont un script de démarrage qui les lancent betement avec un & à la fin de la commande?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°669996
docmaboul
Posté le 10-03-2004 à 18:47:11  profilanswer
 

the real moins moins a écrit :

c'est moi ou la plupart des trucs sous nux se font pas chier à tout ça et ont un script de démarrage qui les lancent betement avec un & à la fin de la commande?


 
non taz a raison et sinon il faut au moins faire un nohup avec votre méthode.

n°669997
Taz
bisounours-codeur
Posté le 10-03-2004 à 18:48:21  profilanswer
 

the real moins moins a écrit :

c'est moi ou la plupart des trucs sous nux se font pas chier à tout ça et ont un script de démarrage qui les lancent betement avec un & à la fin de la commande?

oui mais le code exécuté y a tout ce qu'il faut. l'important pour un daemon, c'est qu'il dépende de init.

n°669998
the real m​oins moins
Posté le 10-03-2004 à 18:48:47  profilanswer
 

je dis pas que taz à tord, mais j'ai juste l'impression que bcp de softs ne se cassent pas la tête à faire ça proprement ?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°669999
the real m​oins moins
Posté le 10-03-2004 à 18:49:35  profilanswer
 

Taz a écrit :

oui mais le code exécuté y a tout ce qu'il faut. l'important pour un daemon, c'est qu'il dépende de init.

euh, jsais pas ce que ça veut dire, mais ok [:petrus75]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°670000
Taz
bisounours-codeur
Posté le 10-03-2004 à 18:50:51  profilanswer
 

ben qu'ils sont détaché de leur parent, pour ne pas souffrir de la mort de ce processus. init, c'est le processus initial, si tu ne dépend que de init, tu ne te termineras que si init se termine

n°670003
docmaboul
Posté le 10-03-2004 à 18:51:50  profilanswer
 

the real moins moins a écrit :

je dis pas que taz à tord, mais j'ai juste l'impression que bcp de softs ne se cassent pas la tête à faire ça proprement ?


 
je ne connais pas bien linux mais sous un unix lorsque le shell à partir duquel on lance le process se terminera, le process "daemon" va recontrer des chtits soucis.

n°670004
docmaboul
Posté le 10-03-2004 à 18:53:12  profilanswer
 

Taz a écrit :

ben qu'ils sont détaché de leur parent, pour ne pas souffrir de la mort de ce processus. init, c'est le processus initial, si tu ne dépend que de init, tu ne te termineras que si init se termine


 
en clair si on ne code pas ça proprement, le script n'est safe que lors du boot ce qui n'est quand même pas terrible terrible...

mood
Publicité
Posté le 10-03-2004 à 18:53:12  profilanswer
 

n°670012
the real m​oins moins
Posté le 10-03-2004 à 19:06:49  profilanswer
 

Taz a écrit :

ben qu'ils sont détaché de leur parent, pour ne pas souffrir de la mort de ce processus. init, c'est le processus initial, si tu ne dépend que de init, tu ne te termineras que si init se termine

ok


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°670014
drasche
Posté le 10-03-2004 à 19:08:57  profilanswer
 

moins moins a écrit :

euh, jsais pas ce que ça veut dire, mais ok [:petrus75]


même moi je connais init :D
(bon ok, juste la théorie, mais tout de même de quoi dire je connais init [:petrus75])


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°670098
nico168
Posté le 10-03-2004 à 20:09:58  profilanswer
 

est ce qu'un :
 
nohup monprog &  
 
suffit ?
 
edit: oups, j'avais loupé le post de DocMaboul


Message édité par nico168 le 10-03-2004 à 20:11:13
n°670099
Taz
bisounours-codeur
Posté le 10-03-2004 à 20:10:44  profilanswer
 

on est cat C là
 
faut rajouter un disown en règle général

n°670111
docmaboul
Posté le 10-03-2004 à 20:20:22  profilanswer
 

nico168 a écrit :

est ce qu'un :
 
nohup monprog &  
 
suffit ?
 
edit: oups, j'avais loupé le post de DocMaboul


 
Ca suffit pour lancer un process en fond de manière safe mais pour un démon, c'est pas terrible. Si mes souvenirs sont bons, ça peut aussi poser des petits problèmes avec les signaux.

n°670115
Taz
bisounours-codeur
Posté le 10-03-2004 à 20:24:11  profilanswer
 

DocMaboul a écrit :


 
Ca suffit pour lancer un process en fond de manière safe mais pour un démon, c'est pas terrible. Si mes souvenirs sont bons, ça peut aussi poser des petits problèmes avec les signaux.

à la bonne heure, c'est un peut tout ce que j'explique dans mon premier message

n°670125
docmaboul
Posté le 10-03-2004 à 20:28:22  profilanswer
 

Taz a écrit :

à la bonne heure, c'est un peut tout ce que j'explique dans mon premier message


 
Non. Ton premier message n'explique rien : il assène.

n°670128
Taz
bisounours-codeur
Posté le 10-03-2004 à 20:29:20  profilanswer
 

bah ouais, quand je dis qu'il faut détourner SIGCHLD vers SIG_IGN, personne se doute que c'est pour pallier les problèmes de signaux

n°670146
docmaboul
Posté le 10-03-2004 à 20:42:36  profilanswer
 

Taz a écrit :

bah ouais, quand je dis qu'il faut détourner SIGCHLD vers SIG_IGN, personne se doute que c'est pour pallier les problèmes de signaux


 
Oui en fait tu as raison. C'est pour ça que rien ne sert de commenter son code : il parle toujours de lui-même.

n°670149
Taz
bisounours-codeur
Posté le 10-03-2004 à 20:48:59  profilanswer
 

DocMaboul a écrit :


 
Oui en fait tu as raison. C'est pour ça que rien ne sert de commenter son code : il parle toujours de lui-même.

le fait est que je n'ai pas donné de code sur ceci, et que le code que j'ai fournit par ailleurs est suffisemment clair

n°670166
docmaboul
Posté le 10-03-2004 à 20:57:02  profilanswer
 

Taz a écrit :

le fait est que je n'ai pas donné de code sur ceci, et que le code que j'ai fournit par ailleurs est suffisemment clair


 
Ratiocine tant que tu veux, cela ne changera pas le fait que ton premier message n'explique rien.
 
Et sur ce, bonsoir. Il est temps d'aller se faire glouglouter le poireau...


Message édité par docmaboul le 10-03-2004 à 20:57:25
n°670177
kyo54
Posté le 10-03-2004 à 20:59:53  profilanswer
 

Taz a écrit :

faut faire un double fork, changer l'id, rajouter un wait pour éviter un defunct, etc. voici un code en python
 

Code :
  1. def fork_exec_disown(cmd, rep):
  2.     try:
  3.         if os.fork()==0:
  4.             if os.fork():
  5.                 sys.exit(0)
  6.             os.chdir(os.path.expanduser(rep))
  7.             os.setsid()
  8.             os.umask(0)
  9.             cmd = cmd.split()
  10.             os.execvp(cmd[0], cmd)
  11.         os.wait()
  12.     except OSError, e:
  13.         print >>sys.stderr, \
  14.               "%s : Cannot change dir to '%s' and run '%s'" % (e, rep, cmd)


 
tu peux également éviter le double fork en manipulant le signal SIGCHLD de façon à ce que SA_NOCLDWAIT soit gérer par SIG_IGN


bien le merci mais je cherche une documentation en C :jap:


---------------
.
n°670206
Taz
bisounours-codeur
Posté le 10-03-2004 à 21:13:41  profilanswer
 

non mais tu le fais expres ou quoi ?
 
tu vois les fork, le exec, le wait, setsid ? oui ? ben tu fais pareil en C

n°670393
kyo54
Posté le 10-03-2004 à 22:57:10  profilanswer
 

OK y'a du nouveau!
J'ai trouvé deux docs d'Unix qui en traitent, et qui sont assez "parentes":
http://www.erlenstar.demon.co.uk/unix/faq_2.html#SEC16
http://www.santal.org/proglinux/pr [...] tml#ss11.5
 
D'après les tests que j'ai fait ça a l'air de marcher. Je vous tiendrais au courant merci de votre aide!


---------------
.
n°670396
Taz
bisounours-codeur
Posté le 10-03-2004 à 23:02:19  profilanswer
 

genre ça serait pas exactement ce que je t'ai dit de faire ? :sol:

n°670405
kyo54
Posté le 10-03-2004 à 23:16:32  profilanswer
 

erf si


---------------
.
n°1064340
boulax
Inserer phrase hype en anglais
Posté le 28-04-2005 à 15:03:47  profilanswer
 

Bon, je déterre de topic /0\
 
Je cherche aussi a programmer un démon en C qui ecoute un port série et log ce qui arrive dans des fichiers. Cela fonctionne bien, quand je le lance en ligne de commande il passe direct à l'arriere plan.
 
Maintenant j'aimerai que ce démon s'execute au démarrage de la machine et soit ressuscité en cas de problème, j'ai donc ajouté une ligne genre:
 
id:23:respawn:/home/user/prog/programme -blabla etc..
 
dans mon inittab. Le probleme c'est que quand je fais ça, je me retrouve apres redemarrage avec une 10aine d'instance du programme qui tournent, une idée ?


---------------
Posté depuis des chiottes, sales. Me gusta.
n°1064362
Taz
bisounours-codeur
Posté le 28-04-2005 à 15:18:03  profilanswer
 

ne fais pas ça. utilise la ton /etc/init.d ou /etc/rc.d selon ta distribution.

n°1064368
boulax
Inserer phrase hype en anglais
Posté le 28-04-2005 à 15:20:29  profilanswer
 

et on peut faire en sorte que le processus soit ressuscité ?


---------------
Posté depuis des chiottes, sales. Me gusta.
n°1221089
trakto
Posté le 12-10-2005 à 12:02:41  profilanswer
 

Salut, regarde du coté de supervise , il y a runit aussi qui implemente les meme fonctionnalitées en remplacant init.
 
runit : http://smarden.org/runit1/
supervise : http://cr.yp.to/daemontools/supervise.html
 
Voila dsl pour le retard je viens de découvrir ce post :-)


---------------
LoLo
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Comment faire un démon sous Linux/unix?

 

Sujets relatifs
IPC UNIX avec C# .netQue me manque t il pour pouvoir compiler ? (C++, Linux)
UNIX et PHPPassage sous linux : j arrive meme pas a compiler un hello world :/
socket AF_UNIx (ou AF_LOCAL)[C] gestion des timeout sous Unix avec select()
[C] programmation IPC (memoire partagee) sous Unix >> magie inside <<Script PHP exportant un bdd ACCESS (Linux)
equivalent à JCreator sous Linux ?Erreur lib graphique linux
Plus de sujets relatifs à : Comment faire un démon sous Linux/unix?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR