J'ai un script shell, qui est essentiellement une ligne avec une journalisation, que j'essaie d'exécuter à partir d'un script init. J'utilise la daemon
fonction à l'intérieur de /etc/init.d/functions
pour l'exécuter, car Redhat ne semble pas être start-stop-daemon
disponible. Lorsque j'appelle le script init ( /etc/init.d/script start
), il reste au premier plan, plutôt que de terminer et de laisser le processus en cours. Quelle est la bonne façon pour moi de faire démoniser ce script?
Script à exécuter:
# conf file where variables are defined
. /etc/script.conf
echo "Starting..." | logger -i
echo "Monitoring $LOG_LOCATION." | logger -i
echo "Sending to $MONITOR_HOST:$MONITOR_PORT." | logger -i
tail -n 1 -F $LOG_LOCATION |
grep WARN --line-buffered |
/usr/bin/nc -vv $MONITOR_HOST $MONITOR_PORT 2>&1 |
logger -i
script d'initialisation:
#!/bin/bash
# Source Defaults
. /etc/default/script
# Source init functions
. /etc/init.d/functions
prog=/usr/local/bin/script.sh
[ -f /etc/script.conf ] || exit 1
RETVAL=0
start()
{
# Quit if disabled
if ! $ENABLED; then
echo "Service Disabled in /etc/default/script"
exit 1
fi
echo "Starting $prog"
daemon $prog
RETVAL=$?
return $RETVAL
}
stop ()
{
echo -n $"Stopping $prog: "
killproc $prog
RETVAL=$?
return $RETVAL
}
reload()
{
echo "Reload command is not implemented for this service."
return $RETVAL
}
restart()
{
stop
start
}
condrestart()
{
echo "Not Implemented."
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status $prog
;;
restart)
restart
;;
reload)
reload
;;
condrestart)
condrestart
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|reload}"
RETVAL=1
esac
~ 20 dernières lignes d'exécution avec bash -vx:
+ case "$1" in
+ start
+ true
+ echo 'Starting /usr/local/bin/script.sh'
Starting /usr/local/bin/script.sh
+ daemon /usr/local/bin/script.sh
+ local gotbase= force=
+ local base= user= nice= bg= pid=
+ nicelevel=0
+ '[' /usr/local/bin/script.sh '!=' /usr/local/bin/script.sh ']'
+ '[' -z '' ']'
+ base=script.sh
+ '[' -f /var/run/script.sh.pid ']'
+ '[' -n '' -a -z '' ']'
+ ulimit -S -c 0
+ '[' -n '' ']'
+ '[' color = verbose -a -z '' ']'
+ '[' -z '' ']'
+ initlog -q -c /usr/local/bin/script.sh
shell-script
rhel
init-script
bshacklett
la source
la source
bash -vx ...
et de publier les dernières lignes afin que nous puissions voir ce qui reste au premier plan.daemon
, il existe également un package RPM . Btw, il existe de nombreux outils de surveillance des journaux ( commencez ici ).#!/bin/bash -vx
? J'ai essayé de le faire, mais cela ne produisait pas la même sortie du script init que si j'exécutais le script shell directement.bash -vx
, c'est-à-dire.bash -vx /etc/init.d/script start
.Réponses:
J'ai trouvé un script sur http://www.linuxforums.org/forum/programming-scripting/190279-daemon-etc-init-d-functions-does-not-return-launching-process.html#post897522 dont j'ai pu à adapter à mes besoins. Il suit manuellement le PID et crée un fichier PID à l'aide
pidof
. J'ai fini par devoir le modifier pour l'utiliserpgrep
car je n'aipidof
pas pu voir le PID de mon script. Après cette modification, cela a bien fonctionné. * Remarque, pgrep ne semble fonctionner que si le nom complet du script comporte moins de 15 caractèresVoici ce que j'ai fini avec:
la source
Je ne connais pas Redhat mais
daemon $prog &
ça me semble étrange. S'il existe déjà une fonction de démonétisation, pourquoi serait-il nécessaire (et utile) de mettre cette fonction elle-même en arrière-plan? Essayez donc sans le&
.la source
/etc/init.d/functions
définit unedaemon
fonction qui s'attend à ce que son argument se démonifie, il ne s'occupe que de choses comme changer l'utilisateur, paramétrer ulimits, vérifier (pas créer!) un fichier pid ... Le meilleur usage de cettedaemon
fonction est de le remplacer par libslackdaemon
;)