Précédent   Forum des professionnels en informatique > Systèmes > Linux > Système
Système Vos questions autour de l'administration système
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/07/2006, 10h31   #1
Invité de passage
 
Inscription : février 2006
Messages : 170
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 170
Points : 3
Points : 3
Par défaut Faire un daemon

Bonjour,

J'ai développé une application pour un module embarqué avec busybox, je cherche a transformer mon programme, qui se lance pour le moment par ligne de commande, en daemon pour qu'il se lance au démarrage de linux.

Si quelqu'un peut m'expliquer comment faire, je suppose que je doit quelque part configurer un fichier linux pour qu'il lance mon executable au démarrage. Par contre je ne sais pas si il faut modifier quelque chose dans le code de mon programme.


Merci d'avance !
olivier857 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2006, 10h41   #2
Membre confirmé
 
Inscription : octobre 2005
Messages : 344
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 344
Points : 270
Points : 270
Mets le dans le inittab ou dans les répertoires /etc/rc.d/rcx.d/
usf70 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2006, 11h11   #3
Invité de passage
 
Inscription : février 2006
Messages : 170
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 170
Points : 3
Points : 3
Ok merci !

Je n'ai pas lesrépertoires /etc/rc.d/rcx.d/ dans mon système embarqué par contre j'ai bien sûr l'initab.

Voilà mon inittab
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#
# inittab
#
#  <ID>:<RUNLEVEL>:<ACTION>:<PROCESS>
#
# Possible actions are:
#
# 	sysinit
#	respawn
#	askfirst
#	wait
#	once
#	restart
#	ctrlaltdel
#	shutdown
#
# This is run first except when booting in single-user mode.
::sysinit:/etc/init.d/rcS
 
# /bin/sh invocations on selected ttys
#
# Start an "askfirst" shell on the console (whatever that may be)
::respawn:/sbin/inetd
::respawn:/sbin/thttpd -c /cgi-bin/
 
# use agetty instead directly connecting sh to console, ttyS0 or ttyS1
# to enable Ctrl-C and Ctrl-\
#::respawn:/sbin/agetty /dev/ttyS0 /bin/sh -l
#::respawn:/sbin/agetty /dev/ttyS1 /bin/sh -l
 
#::respawn:-/bin/sh
 
## Start an "askfirst" shell on /dev/tty2-4
#tty2::askfirst:-/bin/sh
#tty3::askfirst:-/bin/sh
#tty4::askfirst:-/bin/sh
 
# Example of how to put a getty on a serial line (for a terminal)
#
#null::respawn:/sbin/getty -L ttyS0 38400 vt100
 
# Stuff to do when restarting the init process
#::restart:/sbin/init
 
# Stuff to do before rebooting
Pourrais tu m'expliquer le fonctionement du fichier ? Les "::sysinit:", "::respawn:", "null::respawn:" "tty2::askfirst:", "::restart:", ......

Et comment mettre mon appli qui se trouvera par exemple dans "/bin".
olivier857 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2006, 21h14   #4
Membre éclairé
 
Avatar de DBProg
 
Étudiant
Inscription : juillet 2006
Messages : 242
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2006
Messages : 242
Points : 315
Points : 315
Tu devrais avoir /etc/init.d car tu as la ligne

Code :
::sysinit:/etc/init.d/rcS
dans ton inittab. C'est ici que les scripts sont lancés au démarrage. Je ne connais pas busybox, mais su Debian par exemple pour lancer un programme au démarrage il faut :

- Placer un script dans /etc/init.d/monscript
- S'assurer qu'il soit executable (chmod +x)
- Lancer en root : update-rc.d monscript defaults

Pour un exemple de script tu peux regarder ce qui existe déjà, il faut faire un case sur l'argument, et gérer les cas : start, stop, restart. Eventuellement status si tu veux faire le pro
DBProg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2006, 22h03   #5
Invité de passage
 
Inscription : février 2006
Messages : 170
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 170
Points : 3
Points : 3
Citation:
Envoyé par dbprog
Tu devrais avoir /etc/init.d car tu as la ligne

Code :
::sysinit:/etc/init.d/rcS
dans ton inittab. C'est ici que les scripts sont lancés au démarrage. Je ne connais pas busybox, mais su Debian par exemple pour lancer un programme au démarrage il faut :

- Placer un script dans /etc/init.d/monscript
- S'assurer qu'il soit executable (chmod +x)
- Lancer en root : update-rc.d monscript defaults

Pour un exemple de script tu peux regarder ce qui existe déjà, il faut faire un case sur l'argument, et gérer les cas : start, stop, restart. Eventuellement status si tu veux faire le pro

Oui effectivement je dois l'avoir puisque la ligne est présente dans le code. Pourtant j'ai regardé et ca n'y été pas, ca doit être en fichier caché, je regarderai ca lundi.

Par contre j'au réussi a faire mon daemon, en modifiant tout simplement le fichier inittab. J'y ai ajouté la ligne suivante.

::respawn:/appli/mon-prog

J'ai également du modifier l'un des fichier appellés lors de la création de l'image linux de mon module embarqué, afin de créer le répertoire appli dans le système et y copier mon programme.
olivier857 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2006, 22h10   #6
Membre éclairé
 
Avatar de DBProg
 
Étudiant
Inscription : juillet 2006
Messages : 242
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2006
Messages : 242
Points : 315
Points : 315
Il n'y a pas de fichiers cachés sous Linux
DBProg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2006, 22h27   #7
Rédacteur
 
Avatar de Arnaud F.
 
Homme Arnaud Feltz
Développeur .NET
Inscription : août 2005
Messages : 5 204
Détails du profil
Informations personnelles :
Nom : Homme Arnaud Feltz
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Développeur .NET
Secteur : Transports

Informations forums :
Inscription : août 2005
Messages : 5 204
Points : 6 113
Points : 6 113
Citation:
Envoyé par dbprog
Il n'y a pas de fichiers cachés sous Linux


Et les fichiers commencant par un . ils sont pas cachés ceux la?

Tu ne les vois pas en faisant un ls ou sur ton interface graphique
__________________
C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

Installation de Code::Blocks sous Debian à partir de Nightly Builds
Arnaud F. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2006, 22h34   #8
Membre éclairé
 
Avatar de DBProg
 
Étudiant
Inscription : juillet 2006
Messages : 242
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2006
Messages : 242
Points : 315
Points : 315
Certes, je crois que j'ai un peu trop l'habitude de mon alias ls=ls -al

Quoiqu'il en soit il n'y a rien de caché dans /etc/init.d, ou alors c'est pas normal ! (à ma connaissance en tout cas)
DBProg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2006, 22h38   #9
Membre chevronné
 
Homme Stéphane Wirtel
Consultant ERP
Inscription : février 2004
Messages : 636
Détails du profil
Informations personnelles :
Nom : Homme Stéphane Wirtel
Localisation : Belgique

Informations professionnelles :
Activité : Consultant ERP

Informations forums :
Inscription : février 2004
Messages : 636
Points : 736
Points : 736
Envoyer un message via Skype™ à swirtel
question à 0.00001€ comment vas-tu communiquer avec ton daemon ?
__________________
Nul ne peut mieux connaitre la connaissance qu'elle-même.
swirtel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2006, 12h16   #10
Membre habitué
 
Inscription : août 2005
Messages : 118
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 118
Points : 121
Points : 121
Bonjour,
Lancer un daemon à partir de l'inittab n'est pas une tres bonne idée pour une raison philosophique.
L'inittab fixe le comportement du programme init (premier processus). Il décrit les taches que celui-ci doit effectuer pour chaque runlevel. En ce sens, il doit être géneraliste (il s'agit de lancer le système pas des programmes).
L'inittab fait ensuite appel aux scripts dans /etc/init.d/ pour initialiser un certain nombre de choses :
_ Montage des systèmes de fichiers
_ Lancement de daemon
et éventuellement l'initialisation des variables
Ensuite, il ouvre les consoles avec le programme approprier (getty ...)

Par ailleurs, pour lancer un daemon proprement, on utilise l'utilitaire start-stop-daemon qui est fournis avec busybox.

Donc pour ton problème, le plus simple est sans doute de rajouter au moment propice dans rcS quelque chose comme : /etc/init.d/mon_daemon start.
Puis d'éditer le fichier mon_daemon pour le faire ressembler au fichier /etc/init.d/skeleton sous Debian

Ainsi tu pourra entre autre arréter ton programme proprement ( /etc/init.d/mon_daemon stop )

A+
Joris
d-jo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2006, 10h30   #11
Invité de passage
 
Inscription : février 2006
Messages : 170
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 170
Points : 3
Points : 3
Citation:
Envoyé par swirtel
question à 0.00001€ comment vas-tu communiquer avec ton daemon ?

Je ne suis pas sure de comprendre ta question, mais mon daemon communique via le port série avec un lecteur de carte à puce. Le but est de scruter en permanence la présence d'une carte et quand il y en a une qui se badge de lire et d'afficher en fonction de celle-ci des infos sur un petit écran LCD.
olivier857 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2006, 10h48   #12
Invité de passage
 
Inscription : février 2006
Messages : 170
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 170
Points : 3
Points : 3
Citation:
Envoyé par dbprog
Tu devrais avoir /etc/init.d car tu as la ligne

Code :
::sysinit:/etc/init.d/rcS
Bon alors effetivement j'ai bien un fichier "/etc/init.d/rcS" qui n'est pas en fichier caché, j'avais pas fait gaf car en premier lieu usf70 m'avait dit de regarder dans "/etc/rc.d/rcx.d/". Répertoire que je n'ai pas et j'avais pas fait gaf que par contre j'avais "/etc/init.d/rcS". Enfin rien de bien garve, je ferai plus attention la prochaine fois.

Alors voici mon fichier rcS :
Citation:
#!/bin/sh

PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH

echo "Mounting other filesystems ..."

/bin/mount -a

# tmp fs should be world-writeable and mount has no option umask=
chmod 777 /ram

# Local IP
/sbin/ifconfig lo 127.0.0.1
/sbin/route add -net 127.0.0.0 netmask 255.255.255.0 lo

# read EEPROM and run scripts
/sbin/eeprom -r /etc/init.d/eeprom.sh

if [ -e /dev/misc/rtc ]; then
echo "Setting system time"
/sbin/hwclock --hctosys
date
fi
Bon alors d'après d-jo, j'ai cru comprendre que la méthode que j'ai employé en modifiant inittab n'est pas la bonne. Dommage je trouvai que ca marcher bien, en plus la méthode respawn est assez sympa, car si mon appli devait pour quelconque raison s'arretter ou planter elleredémarre aussi tôt grâce a cette méthode.

Alors apparement il faut plutôt que je modifie rcS, mais comment ? Quelqu'un pourrait t'il me montrer sur l'exemple que j'ai mis ci dessus.
olivier857 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2006, 13h15   #13
Membre éclairé
 
Avatar de DBProg
 
Étudiant
Inscription : juillet 2006
Messages : 242
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2006
Messages : 242
Points : 315
Points : 315
Est-ce que tu as quelque chose dans /etc/init.d ? => ls -al /etc/init.d
DBProg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2006, 13h30   #14
Invité de passage
 
Inscription : février 2006
Messages : 170
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 170
Points : 3
Points : 3
Citation:
Envoyé par dbprog
Est-ce que tu as quelque chose dans /etc/init.d ? => ls -al /etc/init.d

Oui oui finalement j'ai bien quelque chose, c'est ce que je disais dans mon dernier post.

J'ai 2 fichiers :
- rcS
Citation:
#!/bin/sh

PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH

echo "Mounting other filesystems ..."

/bin/mount -a

# tmp fs should be world-writeable and mount has no option umask=
chmod 777 /ram

# Local IP
/sbin/ifconfig lo 127.0.0.1
/sbin/route add -net 127.0.0.0 netmask 255.255.255.0 lo

# read EEPROM and run scripts
/sbin/eeprom -r /etc/init.d/eeprom.sh

if [ -e /dev/misc/rtc ]; then
echo "Setting system time"
/sbin/hwclock --hctosys
date
fi
- eeprom.sh
Citation:
#! /bin/sh
# This file will run various features if enable in EEPROM
# It doesn't wait for the mounts to complete so that the target
# continues to boot even on network problems

if [ "x$NFSMOUNT" != "x" ]; then
echo "Mounting $NFSMOUNT to /nfs"
/bin/mount -o nolock -t nfs $NFSMOUNT /nfs
fi

if [ "x$CUSTOMSCRIPT" != "x" ]; then
echo "Running $CUSTOMSCRIPT"
/bin/sh $CUSTOMSCRIPT
fi

if [ "x$WATCHDOG" = "xyes" ]; then
echo "Loading Watchdog driver"
insmod netarm_watchdog.o
fi
eeprom.sh je crois qu'on s'en fou, tout se passe dans rcS, c'est bien çà ? Et comment faut faire ?
olivier857 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2006, 19h07   #15
Membre éclairé
 
Avatar de DBProg
 
Étudiant
Inscription : juillet 2006
Messages : 242
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2006
Messages : 242
Points : 315
Points : 315
D'accord je vois, ça ne fonctionne pas tout à fait comme sous Linux normal. Dans ce cas je pense que tu peux tout simplement rajouter ton fichier dans /etc/init.d et il devrait démarrer tout seul.

Dans ton script que tu rajoutes tu as juste à faire démarrer ton programme, comme si tu le lançais en ligne de commande. Si jamais ça ne fonctionne pas comme ça, rajoute une ligne dans rcS à la fin, là il n'y aura pas de problème je pense.

Désolé de ne pas être plus précis, n'hésite pas à redemander si ça ne fonctionne pas !
DBProg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2006, 09h03   #16
Invité de passage
 
Inscription : février 2006
Messages : 170
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 170
Points : 3
Points : 3
Citation:
Envoyé par dbprog
D'accord je vois, ça ne fonctionne pas tout à fait comme sous Linux normal. Dans ce cas je pense que tu peux tout simplement rajouter ton fichier dans /etc/init.d et il devrait démarrer tout seul.

Dans ton script que tu rajoutes tu as juste à faire démarrer ton programme, comme si tu le lançais en ligne de commande. Si jamais ça ne fonctionne pas comme ça, rajoute une ligne dans rcS à la fin, là il n'y aura pas de problème je pense.

Désolé de ne pas être plus précis, n'hésite pas à redemander si ça ne fonctionne pas !
Ok alors je rajoute un fichier dans le répertoireinit.d et ce fichier est un script qui démarre mon appli. Mais je lui donne quoi comme nom à ce fichier, il n'y a pas d erègles ? On fait ce qu'on veut, comment le système va faire pour le reconnaître.

Et enfin si ca ne marche, la seconde solution est de de pas créer de fichier mais de mettre le contenu de ce script à la fin du fixchier rcS, c'est çà ?

Désolé j'ai en gros reformulé ce que tu m'a dit mais je voudrais être sur d'avoir bien compris.
olivier857 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2006, 11h10   #17
Invité de passage
 
Inscription : février 2006
Messages : 170
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 170
Points : 3
Points : 3
Bon alors j'ai essayer en insérant uniquement le fichier suivant dans init.d :

solde :
Code :
1
2
3
4
#!/bin/sh
 
# Lancement de l'appli de lecture de solde
/appli/post
Rien ne se passe au démarrage, je vais essyer d'ajouter la ligne suivante :
Citation:
/etc/init.d/solde
à la fin du fichier rcS.
olivier857 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2006, 12h58   #18
Membre éclairé
 
Avatar de DBProg
 
Étudiant
Inscription : juillet 2006
Messages : 242
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2006
Messages : 242
Points : 315
Points : 315
En fait ce que je voulais dire quand je disais d'ajouter la ligne dans /etc/rcS ce n'est pas d'ajouter celle que tu as marqué, mais celle-ci :

Comme tu es sur que le script /etc/rcS est exécuté, rajoute cette ligne à la fin, ce qui devrait lancer ton application.

Il faut que tu aies un moyen de contrôler le lancement aussi (ouverture de port, fichier pid, ... etc).
DBProg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2006, 15h08   #19
Invité de passage
 
Inscription : février 2006
Messages : 170
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 170
Points : 3
Points : 3
Bon ok alors j'ai refait le fichier rcS en y ajoutant à sa fin la ligne suivante :
ca marche l'appli se lance après le démarrage, mais par contre je ne comprend pas pourquoi mais je n'arrive plus à prendre la main sur le module embarqué avec telnet. Et ca c'est pas bon pour moi.

Ca ne me faisait pas ca quand je lancer l'appli depuis inittab avec la ligne :
Citation:
Envoyé par dbprog
Il faut que tu aies un moyen de contrôler le lancement aussi (ouverture de port, fichier pid, ... etc).
Comment çà ???
olivier857 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2006, 17h04   #20
Membre éclairé
 
Avatar de DBProg
 
Étudiant
Inscription : juillet 2006
Messages : 242
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2006
Messages : 242
Points : 315
Points : 315
Tu n'as peut-être plus accès au telnet car le serveur ne démarre peut-être pas jusqu'au bout. Peut-être que ton appli ne quittant pas dans le rcS, l'initialisation du système ne se fait pas jusqu'au bout.

Je ne sais pas si je suis très clair. Ce que je veux dire c'est que ton appli ne se terminant pas, le système ne s'initialise peut-être pas jusqu'au bout.

Essaye peut-être de la lancer en rajoutant & à la fin.

Si cela en fonctionne pas il faut créer un deamon dans le code directement. De manière à ce que ton appli sorte de sa boucle main (donc rend la main au système), tout en continuant son exécution en arrière plan.

Pour ça il existe par exemple la fonction daemonize(). Mais je ne peux pas trop t'en dire plus je ne l'ai jamais utilisé. Un peu de google devrait t'aider là dessus. Essaye de regarder il existe eput-être d'autres fonctions pour passer un processus en deamon.

Bon courage !
DBProg est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h42.


 
 
 
 
Partenaires

Hébergement Web