J'ai besoin d'installer un programme en tant que service dans Red Hat. Il ne se déroule pas en arrière-plan, ne gère pas son fichier PID ou ne gère pas ses propres journaux. Il s'exécute et s'imprime simplement sur STDOUT et STDERR.
En utilisant les scripts init standard comme guides, j'ai développé ce qui suit:
#!/bin/bash
#
# /etc/rc.d/init.d/someprog
#
# Starts the someprog daemon
#
# chkconfig: 345 80 20
# description: the someprog daemon
# processname: someprog
# config: /etc/someprog.conf
# Source function library.
. /etc/rc.d/init.d/functions
prog="someprog"
exec="/usr/local/bin/$prog"
[ -e "/etc/sysconfig/$prog" ] && . "/etc/sysconfig/$prog"
lockfile="/var/lock/subsys/$prog"
RETVAL=0
check() {
[ `id -u` = 0 ] || exit 4
test -x "$exec" || exit 5
}
start() {
check
if [ ! -f "$lockfile" ]; then
echo -n $"Starting $prog: "
daemon --user someproguser "$exec"
RETVAL=$?
[ $RETVAL -eq 0 ] && touch "$lockfile"
echo
fi
return $RETVAL
}
stop() {
check
echo -n $"Stopping $prog: "
killproc "exec"
RETVAL=$?
[ $RETVAL -eq 0 ] && rm -f "$lockfile"
echo
return $RETVAL
}
restart() {
stop
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status "$prog"
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|status}"
RETVAL=2
esac
exit $RETVAL
Il se peut que mon erreur ait été de copier-coller et de modifier certains des scripts existants dans /etc/init.d. Dans tous les cas, le service résultant se comporte étrangement:
- quand je le démarre avec
service someprog start
le programme imprime sur le terminal et la commande ne se termine pas. - si je CTRL-C, il affiche "Session terminée, tuant shell ... ... tué. ÉCHEC". Je dois le faire pour récupérer à nouveau mon invite shell.
- maintenant, quand je lance,
service someprog status
il dit qu'il fonctionne et répertorie son PID. Je peux le voirps
donc il fonctionne. - maintenant, quand je cours,
service someprog stop
il n'arrête pas. Je peux vérifier qu'il fonctionne toujours avecps
.
Que dois-je changer pour qu'il someprog
soit envoyé en arrière-plan et géré en tant que service?
Edit: J'ai maintenant trouvé quelques questions connexes, aucune d'entre elles avec une réponse réelle autre que "faire autre chose":
- L'appel au démon dans un script /etc/init.d bloque, ne s'exécute pas en arrière-plan
- Obtenir un script shell à exécuter en tant que démon sur CentOS?
Edit: cette réponse sur le double forking a peut-être résolu mon problème, mais maintenant mon programme lui-même double-forks et cela fonctionne: /programming//a/9646251/898699