Bash Skript mit start-stop-daemon als Dienst laufen lassen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
og2
Beiträge: 34
Registriert: 18.02.2007 14:35:08

Bash Skript mit start-stop-daemon als Dienst laufen lassen

Beitrag von og2 » 17.01.2008 07:52:09

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...

Benutzeravatar
Six
Beiträge: 8069
Registriert: 21.12.2001 13:39:28
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Siegburg

Beitrag von Six » 17.01.2008 10:51:22

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.
Be seeing you!

og2
Beiträge: 34
Registriert: 18.02.2007 14:35:08

Beitrag von og2 » 17.01.2008 12:11:01

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.

Benutzeravatar
Six
Beiträge: 8069
Registriert: 21.12.2001 13:39:28
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Siegburg

Beitrag von Six » 17.01.2008 16:14:24

Ich vermute, -pidfile ist ein Typo und wird so nicht von dir benutzt. Falls doch, so muß es --pidfile (oder -p) heißen. Alternativ versuche das Skript mit --startas und nicht --exec aufzurufen.
Be seeing you!

chr.gogolin
Beiträge: 441
Registriert: 12.10.2005 23:09:28
Lizenz eigener Beiträge: MIT Lizenz
Kontaktdaten:

Beitrag von chr.gogolin » 18.01.2008 20:12:31

Man kann ein Shell-Skrpt unter Angabe des des Dateinamens mittels

Code: Alles auswählen

kill `pidof -x shell-scrip`
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...
"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

og2
Beiträge: 34
Registriert: 18.02.2007 14:35:08

Beitrag von og2 » 19.01.2008 08:29:56

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:

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"
}       

Antworten