Prozess-Ueberwachungs-Script

tuxx

Erfahrenes Mitglied
Re: Nützliche bash Skripte

Ich bastel mit viel Hilfe grad hieran:
Es prüft alle 5 sek. ob ein Programm läuft und startet es im Falle des Absturzes neu.
Kleines Problem noch daran, dass es nur den ersten PID des gestarteten Programmes in die Datei /tmp/.loeschpid schreibt, um das Programm bei Eingabe von "program -stop" zu killen.
Gestartet wird es mit "program /usr/local/bin/name-des-zu-startenden-programmes".

Code:
#!/bin/sh
iam=`basename $0`
prog='/usr/local/bin/program'
if [ "$1" == "" ]
        then
        echo $iam $prog
        echo or
        echo $iam -stop
        exit
fi
if [ "$1" == "-stop" ]
        then
        while read a
            do
                kill -9 $a
            done < /tmp/.loeschpid
            rm -f /tmp/.loeschpid
        exit
fi
if [ "$2" != "-self" ]
        then
        $0 $1 -self&
        exit
fi
pname=`basename $1`
prozesstest=`/bin/ps -A`
rm -f /tmp/.loeschpid
touch /tmp/.loeschpid
while :
        do
        sleep 5
        testpid=`echo $prozesstest | grep $pname | wc -l`
        if [ "$testpid" == 0 ]
                then
                $1
#                ps -ax | grep $pname|grep -v grep|awk '{print $1}' >> /tmp/.loeschpid
#                ps -ax | grep $prog|grep -v grep|awk '{print $1}' >> /tmp/.loeschpid
                pidofproc -k "$prog" >> /tmp/.loeschpid
                pidofproc -k "$pname" >> /tmp/.loeschpid
                echo $$ >> /tmp/.loeschpid
        fi
done
 
Re: Nützliche bash Skripte

Hi.

@tuxx: Wenn dein Bash Skript sowieso dauernd läuft, dann brauchst du eigentlich nicht alle 5 Sek. kucken ob das gestartete Programm noch vorhanden ist, warte doch einfach drauf:
Code:
while true; do
  $1 &
  wait $!
done
 
Re: Nützliche bash Skripte

Danke für den Tip!
Aber ich möchte das ganze gern nach Belieben starten und stoppen können.

Also das Skript läuft nicht permanent, nur bei Bedarf.
 
Zuletzt bearbeitet:
Re: Nützliche bash Skripte

tuxx hat gesagt.:
Danke für den Tip!
Aber ich möchte das ganze gern nach Belieben starten und stoppen können.

Also das Skript läuft nicht permanent, nur bei Bedarf.
Aha, OK. Da könntest du dir allerdings mal launchtool, restartd (hab ich auf die Schnelle keinen Link gefunden) und monit anschauen oder evtl. interessiert dich auch daemonize.

Gruß
 
Re: Nützliche bash Skripte

Ich geb aber nicht auf, eh ich den Fehler gefunden hab. :)
Mit "program -stop" kann ich das Skript beenden, das aufgerufene Programm läuft aber weiter.
Warum?
 
Re: Nützliche bash Skripte

Hast du denn schonmal in die /tmp/.loeschpid geschaut was da drin steht? Stimmt das auch, also stimmen die PIDs da drin mit den PIDs der laufenden Prozesse überein?

Du kannst das Skript ja auch mal mit -x -v aufrufen, da siehst du genau welche Zeile gelesen und was von Bash ausgeführt wird.

Gruß
 
Re: Nützliche bash Skripte

Kill dein Prog doch einfach ;)
Schreib die PID in eine Datei /var/blablabla und schreibe ein zweites Skript, dass beide (Programm u. Skript) beendet
 
Re: Nützliche bash Skripte

Aiju hat gesagt.:
Kill dein Prog doch einfach ;)
Schreib die PID in eine Datei /var/blablabla und schreibe ein zweites Skript, dass beide (Programm u. Skript) beendet
Genau das hat er ja bereits gemacht?! Ob das nun noch ein zweites Skript ist oder im ersten Skript bei einem spez. Parameter verzweigt wird dürfte doch egal sein.

Gruß
 
Re: Nützliche bash Skripte

Die PID´s werden aber nicht oder nicht vollständig in /tmp/.loeschpid geschrieben.
Bislang helf ich mir mit einem Shortcut "killall program && killall script" zum Beenden.
Aber warum schreibt er die PID´s nicht korrekt?
Bzw schreibt sie viel zu spät...?
 
Zuletzt bearbeitet:
Re: Nützliche bash Skripte

Code:
prozesstest=`/bin/ps -A`
while ...
        testpid=`echo $prozesstest | grep $pname | wc -l`
Also du speicherst dir von irgendeinem Zeitpunkt die Ausgabe von /bin/ps -A in der Variablen prozesstest, diese Ausgabe liest du dann in der while-Schleife immer wieder durch (obwohl das immer die gleiche ist) und zählst die Zeilen in denen $pname vorkommt. Wenn du dir die Ausgabe speicherst, ist dein Programm ja noch gar nicht gestartet, d.h. du kannst da keine Zeilen finden - somit ist testpid immer 0.

Deswegen wird auch immer schön ein neues Programm gestartet, die PIDs da in die Datei geschrieben, 5 sek. gewartet und wieder von vorne...

Probier's mal hiermit:
Code:
if ! ps -A | fgrep -w "$pname" >/dev/null; then
  ...
fi

Gruß
 
Zurück