Probléme Stop deamon

Bonjour,

J’ai un petit souci de démon sous raspbian.Je souhaite lancer une application nodejs au démarrage de mon raspberry Pi et pouvoir le stop/start/restart manuellement.
J’arrive a lancer mon démon au démarrage du raspbian, j’arrive a le démarrer aprés la démarrage du raspberry Pi mais je n’arrive pas a le stop via la commande : "sudo service … stop"
J’ai suivis un tutoriel qui utilise le skeleton présent dans le “/etc/init.d” et il y était aussi dit de faire un script sh qui lance mon application et qui serait appelé par mon démon.

J’ai donc comme code:
pour le fichier se trouvant dans “/etc/init.d”

et pour mon script sh:

#!/bin/sh                                                                                                                                                                 
nodejs /home/pi/raspberry/index.js

En regardant sur d’autre tuto, j’ai essayé de kill ou pkill avant de rm le PIDFILE mais ca ne supprime que mon process server.sh et pas celui du nodejs.
A savoir que le start fonctionne correctement (quand je kill manuellement le process et que je start le service, il démarre correctement).
Et quand je fais un restart, le stop ne fonctionant pas, je me retrouve avec 2 process nodejs.De plus, si je laisse le fichier de base, il kill bien le process de mon script sh mais pas celui de mon application nodejs. J’ai essayé plusieurs methodes mais aucune n’a fonctionné :angry:

Cela fait un petit moment que je suis dessus et je comprend pas pourquoi cela ne fonctionne pas.
Désolé si mon erreur est flagrante et merci d’avance pour vos réponse. :confused:
je reste dispo si vous avez des question :wink:

#!/bin/sh exec nodejs /home/pi/raspberry/index.js

Tu noteras le “exec” placé devant ta commande “nodejs”. Ce “exec” fait en sorte que ton script shell passe la main à “nodjs” sans créer de nouveau processus, mais en utilisant l’actuel, donc récupérer le PID et tout le toutim.
Avec le “exec” il devrait se terminer si et seulement si le process “nodejs” se termine.

Petit précision, tout qui se trouve APRÈS la ligne avec “exec” ne sera JAMAIS exécute.

edit : Pour la petit explication, le process “nodejs” était lancé dans un processus différent de celui de ton script shell. Ton script shell une fois qu’il avait réussi à lancer le processus “nodejs” continuait sa vie … c’est à dire rien, donc se terminait normalement. Si je ne me trompe pas, quand tu exécutais ton “daemon” il devait se terminer immédiatement … ou presque.
Du coup la commande “service … stop” ne fonctionnait pas car il n’y avait rien a arrêter.

Merci de répondre aussi vite :slightly_smiling:

edit: le process server.sh continue de s’executer et ne s’arrete que lorsque je le kill ou que le process nodejs est kill. (si je ne met pas d’exec)

Si j’ajoute l’exec, je n’ai plus de process server.sh mais losrque je veux stop, voila ce qu’il me sort:

Aprés avoir fait quelque verif, voila ce que j’ai observé:

Pour le stop, si je laisse le fichier de basse, il ne me kill pas le process nodejs, alors j’ai fais ca pour tester:

do_stop()
{
        # Return
        #   0 if daemon has been stopped
        #   1 if daemon was already stopped      
        #   2 if daemon could not be stopped
        #   other if a failure occurred                             
        start-stop-daemon --stop --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME #"/bin/sh /usr/sbin/server.sh"
        RETVAL="$?"
        [ "$RETVAL" = 2 ] && return 2
        # Wait for children to finish too if this is a daemon that forks                                           
        # and if the daemon is only ever run from this initscript.                                             
        # If the above conditions are not satisfied then add some other code                                
        # that waits for the process to drop all resources that could be                                   
        # needed by services started subsequently.  A last resort is to
        # sleep for some time.

        start-stop-daemon --stop --oknodo --retry=0/30/KILL/5 --exec $DAEMON
        [ "$?" = 2 ] && return 2
        # Many daemons don't delete their pidfiles when they exit. 
   	cat $PIDFILE | xargs pkill -P # << devrait kill le process contenu dans le fichier $PIDFILE
        rm -f $PIDFILE
        return "$RETVAL"
}

Je me demande si la commande est correct mais les autres commande que j’ai test me renvoyaient toutes une erreur de flag ou ne fonctionnaient pas du tout…
Merci encore pour ton aide :smiley:

Bon,

Aprés avoir fait plusieurs recherche, j’ai vue que je n’etais pas le seul a avoir ce probléme…
Je n’ai pas réussit a trouver d’explication a ce probléme et la solution le plus fréquement utilisé (la seule qui fonctionne réellement) est de kill le process…
Pas propre mais ca fait le taf (je suis toujours a la recherche d’une meilleur facon de faire si vous avez…).
Voici donc mon petit bout de code qui fonctionne.

#
# Function that stops the daemon/service
#
do_stop()
{
	# Return
	#   0 if daemon has been stopped
	#   1 if daemon was already stopped
	#   2 if daemon could not be stopped
	#   other if a failure occurred
	#start-stop-daemon --stop --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME 
	#RETVAL="$?"
	#[ "$RETVAL" = 2 ] && return 2
	# Wait for children to finish too if this is a daemon that forks
	# and if the daemon is only ever run from this initscript.
	# If the above conditions are not satisfied then add some other code
	# that waits for the process to drop all resources that could be
	# needed by services started subsequently.  A last resort is to
	# sleep for some time.
	#start-stop-daemon --stop --oknodo --retry=0/30/KILL/5 --pidfile $PIDFILE --exec $DAEMON
	#[ "$?" = 2 ] && return 2
	# Many daemons don't delete their pidfiles when they exit.
	cat $PIDFILE | xargs kill -9
	rm -f $PIDFILE
	return 0
}

A savoir que mon process n’a pas de fils, je conseille un pkill -P si votre démon fait des enfants.
Si ca peut aider…
GLHF