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 start
dem 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 status
es jetzt starte , sagt es, dass es läuft und listet seine PID auf. Ich kann es sehen,ps
damit 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 someprog
es 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