Ich muss ein Programm als Dienst in Red Hat installieren. Es wird kein Hintergrund erstellt, keine PID-Datei verwaltet oder keine eigenen Protokolle verwaltet. Es wird nur ausgeführt und in STDOUT und STDERR gedruckt.
Unter Verwendung der Standard-Init-Skripte als Leitfaden habe ich Folgendes entwickelt:
#!/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
Es kann sein, dass mein Fehler darin bestand, einige der vorhandenen Skripte in /etc/init.d zu kopieren, einzufügen und zu ändern. In jedem Fall verhält sich der resultierende Dienst seltsam:
- Wenn ich es mit
service someprog startdem Programm starte, wird es auf dem Terminal gedruckt und der Befehl wird nicht ausgeführt. - Wenn ich STRG-C drücke, wird "Sitzung beendet, Shell beendet ... ... getötet. FEHLGESCHLAGEN" ausgegeben. Ich muss dies tun, um meine Shell-Eingabeaufforderung wieder zu erhalten.
- Wenn ich
service someprog statuses jetzt starte , sagt es, dass es läuft und listet seine PID auf. Ich kann es sehen,psdamit es läuft. - Wenn ich jetzt laufe
service someprog stop, hört es nicht auf. Ich kann überprüfen, ob es noch läuftps.
Was muss ich ändern, damit someproges in den Hintergrund gesendet und als Service verwaltet wird?
Bearbeiten: Ich habe jetzt ein paar verwandte Fragen gefunden, keine mit einer anderen tatsächlichen Antwort als "etwas anderes tun":
- Der Aufruf des Daemons in einem Skript /etc/init.d wird blockiert und nicht im Hintergrund ausgeführt
- Shell-Skript als Daemon unter CentOS ausführen lassen?
Bearbeiten: Diese Antwort auf Double-Forking hat möglicherweise mein Problem gelöst, aber jetzt hat mein Programm selbst Double-Forks und das funktioniert: /programming//a/9646251/898699