Comment faire un démon sous Linux/unix?

Comment faire un démon sous Linux/unix? - C - Programmation

Marsh Posté le 10-03-2004 à 18:33:37    

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?


---------------
.
Reply

Marsh Posté le 10-03-2004 à 18:33:37   

Reply

Marsh Posté le 10-03-2004 à 18:39:37    

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
Reply

Marsh Posté le 10-03-2004 à 18:46:12    

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 ?
Reply

Marsh Posté le 10-03-2004 à 18:47:11    

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.

Reply

Marsh Posté le 10-03-2004 à 18:48:21    

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.

Reply

Marsh Posté le 10-03-2004 à 18:48:47    

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 ?
Reply

Marsh Posté le 10-03-2004 à 18:49:35    

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 ?
Reply

Marsh Posté le 10-03-2004 à 18:50:51    

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

Reply

Marsh Posté le 10-03-2004 à 18:51:50    

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.

Reply

Marsh Posté le 10-03-2004 à 18:53:12    

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...

Reply

Marsh Posté le 10-03-2004 à 18:53:12   

Reply

Marsh Posté le 10-03-2004 à 19:06:49    

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 ?
Reply

Marsh Posté le 10-03-2004 à 19:08:57    

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)
Reply

Marsh Posté le 10-03-2004 à 20:09:58    

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
Reply

Marsh Posté le 10-03-2004 à 20:10:44    

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

Reply

Marsh Posté le 10-03-2004 à 20:20:22    

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.

Reply

Marsh Posté le 10-03-2004 à 20:24:11    

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

Reply

Marsh Posté le 10-03-2004 à 20:28:22    

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.

Reply

Marsh Posté le 10-03-2004 à 20:29:20    

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

Reply

Marsh Posté le 10-03-2004 à 20:42:36    

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.

Reply

Marsh Posté le 10-03-2004 à 20:48:59    

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

Reply

Marsh Posté le 10-03-2004 à 20:57:02    

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
Reply

Marsh Posté le 10-03-2004 à 20:59:53    

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:


---------------
.
Reply

Marsh Posté le 10-03-2004 à 21:13:41    

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

Reply

Marsh Posté le 10-03-2004 à 22:57:10    

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!


---------------
.
Reply

Marsh Posté le 10-03-2004 à 23:02:19    

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

Reply

Marsh Posté le 10-03-2004 à 23:16:32    

erf si


---------------
.
Reply

Marsh Posté le 28-04-2005 à 15:03:47    

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.
Reply

Marsh Posté le 28-04-2005 à 15:18:03    

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

Reply

Marsh Posté le 28-04-2005 à 15:20:29    

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


---------------
Posté depuis des chiottes, sales. Me gusta.
Reply

Marsh Posté le 12-10-2005 à 12:02:41    

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
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed