Hallo,
ich habe einige daemons in Bash programmiert und möchte diese nun unter Debian als Dienst einrichten.
Hierzu habe ich mir das /etc/skeleton vorgenommen und mich mit dem start-stop-daemon Programm auseinandergesetzt.
Leider scheint hier was nicht zu klappen, denn der start-stop-daemon ist nicht in der Lage ein einmal in den hintergrund gesetztes Bash Programm wieder zu finden. Dadurch würde er es mehrfach starten und auch nicht mehr stoppen können.
Mein derzeitiger Aufruf sieht so aus:
start-stop-daemon --start --exec /opt/mysoft/sbin/mydaemon.sh --background --make-pidfile -pidfile /var/pid/mydaemon.pid
In der Prozesstabelle läuft natürlich:
root 711 1 0 Jan16 ? 00:00:00 /bin/bash /opt/mysoft/sbin/mydaemon.sh
Also letztlich nicht das angegebene (--exec) Programm sondern eine bash. Also per Namen (killall) kann das Hilfsprogramm den Prozess nicht finden. Daher vertraute ich auf das Pidfile. Hierfür scheint sich der start-stop-daemon aber garnicht zu interessieren...
Bash Skript mit start-stop-daemon als Dienst laufen lassen
- Six
- Beiträge: 8069
- Registriert: 21.12.2001 13:39:28
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Siegburg
Da es sich um ein Shell-Skript handelt, muß eine Shell laufen, um das Skript zu interpretieren. Das läßt sich nicht umgehen. Um die Shell (oder jeden anderen Interpreter) los zu werden, muß dein Daemon alleine lauffähig sein und das geht nur mit einer Binärdatei.
Je nachdem was dein Skript macht, würde ich daher das Skript einfach in die crontab schreiben und es z. B. alle 5 Minuten ausführen lassen.
Je nachdem was dein Skript macht, würde ich daher das Skript einfach in die crontab schreiben und es z. B. alle 5 Minuten ausführen lassen.
Be seeing you!
Das mit der Bash ist schon klar. Crontab will ich nicht. Bei Perl Daemons hätte man u.U. das gleiche Problem.
Warum stört sich der start-stop-daemon nicht am PID file? Er müsste eigentlich erkennen das es unter der angegebenen PID einen Prozess gibt und diesen nicht nocheinmal starten, bzw. stoppen können.
Warum stört sich der start-stop-daemon nicht am PID file? Er müsste eigentlich erkennen das es unter der angegebenen PID einen Prozess gibt und diesen nicht nocheinmal starten, bzw. stoppen können.
-
- Beiträge: 441
- Registriert: 12.10.2005 23:09:28
- Lizenz eigener Beiträge: MIT Lizenz
-
Kontaktdaten:
Man kann ein Shell-Skrpt unter Angabe des des Dateinamens mittels
killen.
Ich kenne mich mit dem start-stop-daemon nicht aus, aber vielleicht kann man ihm ja beübrigen das Skript auf diese weise zu toten und mit dem pidof befehl zu überprüfen ob es läuft...
Code: Alles auswählen
kill `pidof -x shell-scrip`
Ich kenne mich mit dem start-stop-daemon nicht aus, aber vielleicht kann man ihm ja beübrigen das Skript auf diese weise zu toten und mit dem pidof befehl zu überprüfen ob es läuft...
"Linux supports the notion of a command line or a shell for the same reason that only children read books with only pictures in them." - Bill Garrett
pidof -x war mir bekannt, aber ich dachte man könnte das alles mit dem start-stop-daemon, "Debian-Like" machen. Geht scheinbar nicht...
Jetzt habe ich es in der Tat mit einer eigenen Startprozedur unter Zuhilfenahme von pidof gemacht. Hierfür habe ich die Funktionen "do_start", "do_stop" wie folgt umgeschrieben:
Jetzt habe ich es in der Tat mit einer eigenen Startprozedur unter Zuhilfenahme von pidof gemacht. Hierfür habe ich die Funktionen "do_start", "do_stop" wie folgt umgeschrieben:
Code: Alles auswählen
do_start()
{
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
daemon="$1"
name=${daemon##*/}
pid=$(pidof -x $daemon)
pidfile="/var/run/$name.pid"
test -n "$pid" && return 1
start-stop-daemon --start --quiet --make-pidfile --pidfile $pidfile \
--background --exec $daemon || return 2
sleep 0.3
pid=$(pidof -x $daemon)
test -z "$pid" && { rm $pidfile; return 2; }
return 0
}
do_stop()
{
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred
daemon="$1"
name=${daemon##*/}
pidfile="/var/run/$name.pid"
# --retry=TERM/30/KILL/5
start-stop-daemon --stop --pidfile $pidfile
RETVAL="$?"
[ "$RETVAL" = 2 ] && return 2
# Many daemons don't delete their pidfiles when they exit.
rm -f $pidfile
return "$RETVAL"
}