Problem mit einem Skript

  • Hallo,


    ich habe mir ein kleines Skript geschrieben um eine Software zu starten und zu stoppen. Das Problem war das sich die PID der Software bei jedem Start ändert deshalb hab ich einfach mal drauf los gescriptet ;=)


    Ich hab so gut wie keine Ahnung von Shell-Skripten aber immerhin funktioniert es schon mal halbwegs. Hier erstmal das Skript:


    PROGRAMMNAME=Testsoftware
    PROGRAMMPID=`ps ux | awk '/Testsoftware/ && !/awk/ {print $2}'`


    rc_reset
    case "$1" in
    start)


    echo -n "Starting - $PROGRAMMNAME"
    "/opt/Testsoftware/start.sh" $PROGRAMMNAME
    rc_status -v
    rc_reset


    ;;



    stop)


    if [ "$PROGRAMMPID" = "" ] ; then
    echo "Testsoftware läuft nicht"
    else
    echo -n "Testsoftware stoppen"
    kill $PROGRAMMPID
    fi
    rc_status -v
    rc_reset


    ;;



    *)
    echo "Usage: $0 {start|stop}"
    exit 1
    ;;
    esac
    rc_exit



    So jetzt möchte ich eigentlich noch eine Abfrage mit einbauen die prüft ob nach dem stoppen die PID noch da ist. Das soll so lange gemacht werden bis die PID verschwunden oder es vergeht eine gewisse Zeit sagen wir mal zwei Minuten dann soll ein kill -9 hinterhergeschoben werden.


    Mir ist das mittlerweile echt zu hoch vielleicht hat jemand eine Idee? Wenns geht den Code so einfach wie möglich halten das ich noch durchblicke ;)

  • PROGRAMMPID=`ps ux | awk '/Testsoftware/ && !/awk/ {print $2}'`


    zu testen ob ein program läuft nehme ich gerne
    pidof testsoftware


    die antwort ist etweder 1 oder 0.
    mit
    und die nummer ist auch gleich mit dabei.
    geht den kein killall programname?

    HauptVDR AMD Goede 1750 Easyvdr 0.06.4
    FF_TT2.3 Skystar2.6c 1x160GB + 1x1TB lautloser Rechner weil er im Keller steht. :D


    2x MediaMVP als Client+VOMPServer-Plugin


    TestVDR AMD Goede 1750 mit TT1.5 Easyvdr 06.*
    Bootet auf einer komischen Weise
    PicoPSU als NT


  • LG Ronny

  • Hi,


    das mit dem pidof wollte ich erst machen das Problem ist die Software startet mehrere Instanzen mit unterschiedlichen PID´s. Deshalb habe ich speziell nach dem Namen in der Prozessliste gesucht und diese PID dann in die Variable geschrieben.


    Das mit dem killall geht nicht. Die Anwendung fährt sauber runter wenn ich einen kill mache. Nur dauert es halt eine Weile, ist unterschiedlich, bis die Software gestoppt ist.


    Der kill -9 soll nur als letzte Rettung rausgehauen werden wenn es zu lange dauert. Das Skript ist mit in den Autostart eingebaut und wenn die Software mein runterfahren des Systems hängt würde das OS nicht mehr stoppen.

  • Zitat

    das mit dem pidof wollte ich erst machen das Problem ist die Software startet mehrere Instanzen mit unterschiedlichen PID´s. Deshalb habe ich speziell nach dem Namen in der Prozessliste gesucht und diese PID dann in die Variable geschrieben.


    Dafür gibts doch schon pgrep


    pgrep $PRORAMMNAME


    gibt dir die PID zurück.

  • Hi,


    also ich habe jetzt das Skript von ronnykornexl genommen und es funktioniert soweit. Die 20 hinter dem Timeout sind Sekunden oder? Vieleicht könnte jemand noch mal kurt erklären was dort gemacht wird?


    Und zwar diesen Teil hier verstehe ich nicht ganz:
    while ps -p $PIDS >/dev/null 2>&1 ; do
    printf .
    sleep 1s
    TIMEOUT=$((TIMEOUT-1))


    Ich habe mein Skript jetzt so weit das die Software startet und stopt. Nur liefert mein SUSE nach dem stopen ein failed zurück obwohl die Software sauber gestopt wurde. Hat dazu noch jemand eine Idee?


    Und das zweite ist wenn die Software nicht gestartet ist und ich führe das Skript zum stopen aus wird nicht echo "$PROGRAMMNAME not running"
    angezeigt sondern Software wird gestartet. Muss diese Abfrage vielleicht davor? Sprich erst prüfen ob die Software läuft und wenn nicht dann stopen?


  • Morgen


    Zu 1:


    Ist eine kleine Schleife, die ausgeführt wird solange ps -p (-p = pid) einen positiven Returnwert hat, geht auch mit until.


    http://www.tldp.org/LDP/abs/html/


    Zu 2:


    Das sollte das hier sein:


    Code
    rc_status -v
    rc_reset


    Müßte, also wie folgt aussehen, rc_status und Co. nehmen den letzt ausgeführten Befehl, und werten den Rückgabewert aus.


    Code
    ....
    ! pidof $PROGRAMMNAME -o $$
    # oder
    pidof $PROGRAMMNAME -o $$
    rc_status -v
    rc_reset


    Zu 3:


    Dann mußt Du wohl selbst einen Test einbauen, gilt das selbe wie unter Punkt 2 (rc_status -v
    rc_reset ...).


    Am besten einfach mal die anderen rc scripte anschauen.


    LG Ronny

  • Hi,


    jetzt funktioniert alles bis auf den zurückgegebenen Status. Ich hänge nochmal das aktuelle Skript rein:


    stop)


    if [ "$PROGRAMMPID" = "" ] ; then
    echo -n "Software not running"
    else
    echo -n "Software starting - $SOFTWARENAME"
    kill $PROGRAMMPID 2>/dev/null
    TIMEOUT=60
    while ps -p $PROGRAMMPID >/dev/null 2>&1 ; do
    printf .
    sleep 1s
    TIMEOUT=$((TIMEOUT-1))
    test $TIMEOUT = 0 && kill -9 $PROGRAMMPID
    done
    fi
    rc_status -v
    rc_reset
    ;;


    Wenn ich jetzt das stop ausführe und das Programm ist nicht gestartet kommt die Meldung "Software not running". Ansonsten also wenn die Software gestartet wird fährt die Software kontrolliert runter. Dann kommt aber noch die Meldung failed vom System.


    Könnt Ihr das nochmal genauer erklären mit dem rc_status?

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!