Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 08/10/2013, à 09: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, à 15: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, à 07:35

lamoule74

Re : faire son propre service/daemon

Aaaaah pingouinux, je savais que tu répondrais à cette discussion big_smile

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, à 07: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, à 07:53

lamoule74

Re : faire son propre service/daemon

pingouinux a écrit :

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, à 07:57

lamoule74

Re : faire son propre service/daemon

oups autant pour moi ça y était pas roll
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, à 07: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, à 08:16

pingouinux

Re : faire son propre service/daemon

lamoule74 #5 a écrit :

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, à 08:20)

Hors ligne

#8 Le 09/10/2013, à 08:21

lamoule74

Re : faire son propre service/daemon

pingouinux a écrit :

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, à 08: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, à 08: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, à 08:29)

Hors ligne

#10 Le 09/10/2013, à 08: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, à 08: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, à 08: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, à 08: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, à 09:57

lamoule74

Re : faire son propre service/daemon

pingouinux a écrit :

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à !

pingouinux a écrit :

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 smile , 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, à 10: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, à 21: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, à 10:19)

Hors ligne

#15 Le 15/10/2013, à 10: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 ? :

pingouinux a écrit :

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, à 10: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, à 10:31

pingouinux

Re : faire son propre service/daemon

lamoule74 #15 a écrit :

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

  1. aaa   bbb

  2. ccc   ddd

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