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
Antworten:
Der Befehl "wird nicht abgeschlossen", da die
daemon
Funktion Ihre Anwendung für Sie nicht im Hintergrund ausführt. Sie müssen&
am Ende Ihresdaemon
Befehls wie folgt ein hinzufügen :daemon --user someproguser $exec &
Wenn
someprog
dies nicht der Fall istSIGHUP
, sollten Sie den Befehl mit ausführen,nohup
um sicherzustellen, dass Ihr Prozess nicht empfangen wird.SIGHUP
Dadurch wird Ihr Prozess angewiesen, beim Beenden der übergeordneten Shell zu beenden. Das würde so aussehen:daemon --user someproguser "nohup $exec" &
Tut in Ihrer
stop
Funktionkillproc "exec"
nichts, um Ihr Programm zu stoppen. Es sollte so lauten:killproc $exec
killproc
erfordert den vollständigen Pfad zu Ihrer Anwendung, um sie ordnungsgemäß zu stoppen. Ich hattekillproc
in der Vergangenheit einige Probleme damit , daher können Sie auch einfach die PID in der PIDFILE löschen, in die Sie die PID schreiben solltensomeprog
, mit so etwas:cat $pidfile | xargs kill
Sie können die PIDFILE folgendermaßen schreiben:
ps aux | grep $exec | grep -v grep | tr -s " " | cut -d " " -f2 > $pidfile
wo
$pidfile
Punkte zu/var/run/someprog.pid
.Wenn Sie [OK] oder [FAILED] für Ihre
stop
Funktion wünschen , sollten Sie die Funktionensuccess
undfailure
von verwenden/etc/rc.d/init.d/functions
. Sie benötigen diese nicht in derstart
Funktion, da siedaemon
die für Sie geeignete aufruft.Sie benötigen außerdem nur Anführungszeichen um Zeichenfolgen mit Leerzeichen. Es ist jedoch eine Stilwahl, also liegt es an Ihnen.
Alle diese Änderungen sehen folgendermaßen aus:
quelle
Wenn dies Ihr Programm ist, schreiben Sie es bitte als richtigen Daemon. Besonders wenn es zur Umverteilung ist. :) :)
Sie könnten versuchen, zu überwachen . Oder vielleicht so etwas wie Runit oder Daemontools. Diese mächtigen haben nicht sofort verfügbare Pakete. Daemontools ist von DJB, wenn dies Ihre Entscheidung beeinflusst (in beide Richtungen).
quelle
Ich habe weitere Nachforschungen angestellt und es scheint, dass die Antwort lautet: "Das können Sie nicht tun." Das auszuführende Programm muss sich tatsächlich ordnungsgemäß dämonisieren: seine Standard-Dateihandles aufteilen und trennen, vom Terminal trennen und eine neue Sitzung starten.
Edit: anscheinend irre ich mich - Double Forking würde funktionieren. /programming//a/9646251/898699
quelle