#1 Le 08/10/2013, à 10:06
- lamoule74
faire son propre service/daemon
Bonjour à tous, j'essaye de faire un script de démarrage qui lance 2 applications et je suis en train de le tester pour voir si simplement le start et le stop fonctionnent:
Je souhaite lancer un exécutable compilé avec gcc et le logiciel mjpg streamer. Du coup j'ai suivi un tuto qui conseillait de récupérer le fichier d'exemple "skeleton"
mais je rencontre des petits soucis...
1. je dois passer les arguments :
-i "/root/mjpg-streamer/input_uvc.so -f 13 -r 640x480" -o "/root/mjpg-streamer/output_http.so -w /root/mjpg-streamer/www"
(tels quels dans le terminal) mais je n'arrive pas les passer dans la variable DAEMON_ARGS_2, par contre j'y arrive en y écrivant en dur... (en dé-commentant la ligne 61)
2.je n'obtiens pas les message de démarrage et d'arrêt du script.. (lignes 112 et 120, pas essayé les autres )
Je vous le mets en dessous pour que vous puissiez comprendre ce que je souhaite faire...
1 #! /bin/sh
2 ### BEGIN INIT INFO
3 # Provides: skeleton
4 # Required-Start: $remote_fs $syslog
5 # Required-Stop: $remote_fs $syslog
6 # Default-Start: 2 3 4 5
7 # Default-Stop: 0 1 6
8 # Short-Description: Example initscript
9 # Description: This file should be used to construct scripts to be
10 # placed in /etc/init.d.
11 ### END INIT INFO
12
13 # Author: OB
14
15 # Do NOT "set -e"
16
17 # PATH should only include /usr/* if it runs after the mountnfs.sh script
18 PATH=/sbin:/usr/sbin:/bin:/usr/bin
19 DESC="firefighter robot's program"
20 NAME=shm_datas
21 NAME_2=mjpg_streamer
22 DAEMON=/root/Programmes/$NAME
23 DAEMON_2=/root/mjpg-streamer/$NAME_2
24 DAEMON_ARGS=""
25 DAEMON_ARGS_2="-i '/root/mjpg-streamer/input_uvc.so -f 13 -r 640x480' -o '/root/mjpg-streamer/output_http.so -w /root/mjpg-streamer/www'"
26 PIDFILE=/var/run/$NAME.pid
27 PIDFILE_2=/var/run/$NAME_2.pid
28 SCRIPTNAME=/etc/init.d/firefighter
29
30 # Exit if the package is not installed
31 [ -x "$DAEMON" ] || exit 0
32 [ -x "$DAEMON_2" ] || exit 0
33
34 # Read configuration variable file if it is present
35 [ -r /etc/default/$NAME ] && . /etc/default/$NAME
36 [ -r /etc/default/$NAME_2 ] && . /etc/default/$NAME_2
37
38 # Load the VERBOSE setting and other rcS variables
39 . /lib/init/vars.sh
40
41 # Define LSB log_* functions.
42 # Depend on lsb-base (>= 3.2-14) to ensure that this file is present
43 # and status_of_proc is working.
44 . /lib/lsb/init-functions
45
46 #
47 # Function that starts the daemon/service
48 #
49 do_start()
50 {
51 # Return
52 # 0 if daemon has been started
53 # 1 if daemon was already running
54 # 2 if daemon could not be started
55 start-stop-daemon --start --quiet --background --pidfile $PIDFILE --exec $DAEMON --test > /dev/null && \
56 start-stop-daemon --start --quiet --background --pidfile $PIDFILE_2 --exec $DAEMON_2 --test > /dev/null \
57 || return 1
58 start-stop-daemon --start --quiet --background --pidfile $PIDFILE --exec $DAEMON -- \
59 $DAEMON_ARGS && \
60 start-stop-daemon --start --quiet --background --pidfile $PIDFILE_2 --exec $DAEMON_2 -- \
61 #-i "/root/mjpg-streamer/input_uvc.so -f 13 -r 640x480" -o "/root/mjpg-streamer/output_http.so -w /root/mjpg-streamer/www" \
62 $DAEMON_ARGS_2 \
63 || return 2
64 # Add code here, if necessary, that waits for the process to be ready
65 # to handle requests from services started subsequently which depend
66 # on this one. As a last resort, sleep for some time.
67 }
68
69 #
70 # Function that stops the daemon/service
71 #
72 do_stop()
73 {
74 # Return
75 # 0 if daemon has been stopped
76 # 1 if daemon was already stopped
77 # 2 if daemon could not be stopped
78 # other if a failure occurred
79 start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
80 start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE_2 --name $NAME_2
81 RETVAL="$?"
82 [ "$RETVAL" = 2 ] && return 2
83 # Wait for children to finish too if this is a daemon that forks
84 # and if the daemon is only ever run from this initscript.
85 # If the above conditions are not satisfied then add some other code
86 # that waits for the process to drop all resources that could be
87 # needed by services started subsequently. A last resort is to
88 # sleep for some time.
89 start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
90 start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON_2
91 [ "$?" = 2 ] && return 2
92 # Many daemons don't delete their pidfiles when they exit.
93 rm -f $PIDFILE $PIDFILE_2
94 return "$RETVAL"
95 }
96
97 #
98 # Function that sends a SIGHUP to the daemon/service
99 #
100 do_reload() {
101 #
102 # If the daemon can reload its configuration without
103 # restarting (for example, when it is sent a SIGHUP),
104 # then implement that here.
105 #
106 start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
107 return 0
108 }
109
110 case "$1" in
111 start)
112 [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME & $NAME_2"
113 do_start
114 case "$?" in
115 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
116 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
117 esac
118 ;;
119 stop)
120 [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME & $NAME_2"
121 do_stop
122 case "$?" in
123 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
124 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
125 esac
126 ;;
127 status)
128 status_of_proc "$DAEMON" "$NAME & $NAME_2" && exit 0 || exit $?
129 ;;
130 #reload|force-reload)
131 #
132 # If do_reload() is not implemented then leave this commented out
133 # and leave 'force-reload' as an alias for 'restart'.
134 #
135 #log_daemon_msg "Reloading $DESC" "$NAME"
136 #do_reload
137 #log_end_msg $?
138 #;;
139 restart|force-reload)
140 #
141 # If the "reload" option is implemented then remove the
142 # 'force-reload' alias
143 #
144 log_daemon_msg "Restarting $DESC" "$NAME & $NAME_2"
145 do_stop
146 case "$?" in
147 0|1)
148 do_start
149 case "$?" in
150 0) log_end_msg 0 ;;
151 1) log_end_msg 1 ;; # Old process is still running
152 *) log_end_msg 1 ;; # Failed to start
153 esac
154 ;;
155 *)
156 # Failed to stop
157 log_end_msg 1
158 ;;
159 esac
160 ;;
161 *)
162 echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
163 exit 3
164 ;;
165 esac
Merci d'avance.
Ubuntu est un mot Africain qui veut dire:"Je n'ai pas réussi à configurer ma Debian"
Hors ligne
#2 Le 08/10/2013, à 16:56
- pingouinux
Re : faire son propre service/daemon
Bonjour,
Question 1
Si tu peux faire tourner ton script en bash, au lieu de sh, tu dois pouvoir utiliser un tableau :
Ligne 25
DAEMON_ARGS_2=( -i '/root/mjpg-streamer/input_uvc.so -f 13 -r 640x480' -o '/root/mjpg-streamer/output_http.so -w /root/mjpg-streamer/www' )
Ligne 62
"${DAEMON_ARGS_2[@]}" \
Hors ligne
#3 Le 09/10/2013, à 08:35
- lamoule74
Re : faire son propre service/daemon
Aaaaah pingouinux, je savais que tu répondrais à cette discussion
Alors en changeant les 2 lignes j'ai en retour:
/etc/init.d/firefighter.sh start
/etc/init.d/firefighter.sh: 25: Syntax error: "(" unexpected
Ubuntu est un mot Africain qui veut dire:"Je n'ai pas réussi à configurer ma Debian"
Hors ligne
#4 Le 09/10/2013, à 08:40
- pingouinux
Re : faire son propre service/daemon
Comme je te le disais en #2, il faut utiliser bash. Tu peux remplacer la Ligne 1 par
#!/bin/bash
J'aurais dû être plus explicite.
Hors ligne
#5 Le 09/10/2013, à 08:53
- lamoule74
Re : faire son propre service/daemon
Comme je te le disais en #2, il faut utiliser bash. Tu peux remplacer la Ligne 1 par
#!/bin/bash
J'aurais dû être plus explicite.
bein oui, mais j'avais compris ça... c'était déjà le cas elle y est cette ligne..
manquerai pas un $ devant la parenthèse ? DAEMON_ARGS_2=(
Ubuntu est un mot Africain qui veut dire:"Je n'ai pas réussi à configurer ma Debian"
Hors ligne
#6 Le 09/10/2013, à 08:57
- lamoule74
Re : faire son propre service/daemon
oups autant pour moi ça y était pas
J'étais persuadé que le script était en bash...
Bon par contre ya encore une erreur:
debarm:~# /etc/init.d/firefighter.sh start
/etc/init.d/firefighter.sh: line 63: -i : commande introuvable
Dernière modification par lamoule74 (Le 09/10/2013, à 08:57)
Ubuntu est un mot Africain qui veut dire:"Je n'ai pas réussi à configurer ma Debian"
Hors ligne
#7 Le 09/10/2013, à 09:16
- pingouinux
Re : faire son propre service/daemon
manquerai pas un $ devant la parenthèse ? DAEMON_ARGS_2=(
Non, il n'en faut pas, et je te soupçonne de l'avoir rajouté. En tout cas, ça expliquerait ton erreur en #6..
Ajouté :
DAEMON_ARGS_2=$(.....) : Résultat d'une commande
DAEMON_ARGS_2=(.....) : Initialisation d'un tableau
Dernière modification par pingouinux (Le 09/10/2013, à 09:20)
Hors ligne
#8 Le 09/10/2013, à 09:21
- lamoule74
Re : faire son propre service/daemon
Non, il n'en faut pas, et je te soupçonne de l'avoir rajouté.
Bein non pour le coup je me suis pas permis, vu que j'ai constaté mon oubli sur la première ligne...
Dernière modification par lamoule74 (Le 09/10/2013, à 09:21)
Ubuntu est un mot Africain qui veut dire:"Je n'ai pas réussi à configurer ma Debian"
Hors ligne
#9 Le 09/10/2013, à 09:28
- pingouinux
Re : faire son propre service/daemon
Dans ce cas, peux tu montrer (copier-coller) quelques lignes de ton script autour de la 63, ainsi que la définition de DAEMON_ARGS_2 ?
Dernière modification par pingouinux (Le 09/10/2013, à 09:29)
Hors ligne
#10 Le 09/10/2013, à 09:34
- lamoule74
Re : faire son propre service/daemon
la déclaration:
DAEMON_ARGS_2=( -i '/root/mjpg-streamer/input_uvc.so -f 13 -r 640x480' -o '/root/mjpg-streamer/output_http.so -w /root/mjpg-streamer/www' )
et la fonction:
do_start()
{
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
start-stop-daemon --start --quiet --background --pidfile $PIDFILE --exec $DAEMON --test > /dev/null && \
start-stop-daemon --start --quiet --background --pidfile $PIDFILE_2 --exec $DAEMON_2 --test > /dev/null \
|| return 1
start-stop-daemon --start --quiet --background --pidfile $PIDFILE --exec $DAEMON -- \
$DAEMON_ARGS && \
start-stop-daemon --start --quiet --background --pidfile $PIDFILE_2 --exec $DAEMON_2 -- \
#-i "/root/mjpg-streamer/input_uvc.so -f 13 -r 640x480" -o "/root/mjpg-streamer/output_http.so -w /root/mjpg-stream
"${DAEMON_ARGS_2[@]}" \
|| return 2
# Add code here, if necessary, that waits for the process to be ready
# to handle requests from services started subsequently which depend
# on this one. As a last resort, sleep for some time.
}
Ubuntu est un mot Africain qui veut dire:"Je n'ai pas réussi à configurer ma Debian"
Hors ligne
#11 Le 09/10/2013, à 09:39
- lamoule74
Re : faire son propre service/daemon
Tiens c'est bizarre, j'ai voulu commenter la ligne 62 et dé-commenter la 61 (ce qui fonctionnait sans soucis auparavant)
Et le script me retourne :
debarm:~# /etc/init.d/firefighter.sh start
/etc/init.d/firefighter.sh: line 63: syntax error near unexpected token `||'
/etc/init.d/firefighter.sh: line 63: ` || return 2'
J'ai peut être ajouté une erreur malencontreusement
Dernière modification par lamoule74 (Le 09/10/2013, à 09:39)
Ubuntu est un mot Africain qui veut dire:"Je n'ai pas réussi à configurer ma Debian"
Hors ligne
#12 Le 09/10/2013, à 09:54
- pingouinux
Re : faire son propre service/daemon
Il manque le \ à la fin de cette ligne
-i "/root/mjpg-streamer/input_uvc.so -f 13 -r 640x480" -o "/root/mjpg-streamer/output_http.so -w /root/mjpg-stream
et ne laisse pas de lignes commentées dans une séquence de lignes se terminant par \.
Hors ligne
#13 Le 09/10/2013, à 10:57
- lamoule74
Re : faire son propre service/daemon
Il manque le \ à la fin de cette ligne
Alors, utilisant le logiciel vim, j'ai du mal copier le code dans la balise du fofo ( donc le '\' y était bel et bien)
Par contre le commentaire au milieu des retours à la ligne mettaient le bronx... Ça venait de là !
et ne laisse pas de lignes commentées dans une séquence de lignes se terminant par \.
Donc premier problème résolu, merci à toi , maintenant je dois chercher pourquoi il ne m'affiche pas les message de start et de stop quand je le lance...si tu as une idée... Je suis tout ouï.
Au passage, pourquoi :
"${DAEMON_ARGS_2[@]}" \
et pas
"${DAEMON_ARGS_2[0]}" \
ça signifie quoi le @ ? ( j'ai read le fucking manuel mais je suis pas sûr d'avoir tout pigé)
Dernière modification par lamoule74 (Le 09/10/2013, à 11:51)
Ubuntu est un mot Africain qui veut dire:"Je n'ai pas réussi à configurer ma Debian"
Hors ligne
#14 Le 10/10/2013, à 22:08
- pingouinux
Re : faire son propre service/daemon
Je n'avais pas vu que tu avais modifié ton dernier message.
C'est plus facile de montrer un exemple :
Initialisation d'un tableau de 3 éléments :
$ tablo=( "aaa bbb" "ccc ddd" "eee fff")
Les 3 éléments sont bien pris en compte, même s'ils contiennent des espaces :
$ for i in "${tablo[@]}"; do echo "=$i="; done
=aaa bbb=
=ccc ddd=
=eee fff=
On ne récupère que le 1er élément du tableau (indice 0) :
$ for i in "${tablo[0]}"; do echo "=$i="; done
=aaa bbb=
Tous les éléments sont regroupés en un seul :
$ for i in "${tablo[*]}"; do echo "=$i="; done
=aaa bbb ccc ddd eee fff=
Les espaces internes aux éléments sont considérés comme des séparateurs, chaque élément est ici dédoublé :
$ for i in ${tablo[*]}; do echo "=$i="; done
=aaa=
=bbb=
=ccc=
=ddd=
=eee=
=fff=
$ for i in ${tablo[@]}; do echo "=$i="; done
=aaa=
=bbb=
=ccc=
=ddd=
=eee=
=fff=
Dernière modification par pingouinux (Le 15/10/2013, à 11:19)
Hors ligne
#15 Le 15/10/2013, à 11:01
- lamoule74
Re : faire son propre service/daemon
heuu j'ai pas compris le dernier exemple.. tu n'a pas fait d'erreur de copier/coller ? :
Les espaces internes aux éléments sont considérés comme des séparateurs, chaque élément est ici dédoublé :
$ for i in ${tablo[*]}; do echo "=$i="; done =aaa= =bbb= =ccc= =ddd= =eee= =fff= $ for i in ${tablo[@]}; do echo "=$i="; done =aaa= =bbb= =ccc= =ddd= =eee= =fff=
Et pour l'affichage du message quelqu'un à une idée ?
Dernière modification par lamoule74 (Le 15/10/2013, à 11:08)
Ubuntu est un mot Africain qui veut dire:"Je n'ai pas réussi à configurer ma Debian"
Hors ligne
#16 Le 15/10/2013, à 11:31
- pingouinux
Re : faire son propre service/daemon
heuu j'ai pas compris le dernier exemple.. tu n'a pas fait d'erreur de copier/coller ? :
Non, et il suffisait que tu essayes pour le vérifier.
tablo contient 3 éléments (contenant eux-mêmes des espaces) :
aaa bbb
ccc ddd
eee fff
for i in "${tablo[@]}"
i va prendre successivement les 3 arguments ci-dessus, ce qui est correct
for i in ${tablo[@]}
i va prendre successivement 6 valeurs (aaa bbb ccc ddd eee fff), ce qui n'est pas correct
Hors ligne