• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] Prüfen ob Programm läuft /Neustarten

Falkenstein

Hacker
Hallo!
Ich bräuchte ein kleines Script, welches ein Programm startet, alle 5 sek. prüft ob es läuft und es ansonsten ggf. neu startet.
Hat da jemand einen Vorschlag für mich?

Geht das mit dem hier irgendwie:
http://www.linux-club.de/viewtopic.php?t=46680&start=0&postdays=0&postorder=asc&highlight=pr%FCfen+l%E4uft
?

Vielleicht so:

#!/bin/sh
runProgram.sh
while true
do
sleep 1
else
runProgram.sh
done

Kein Plan davon...
 

regexer

Advanced Hacker
tuxx schrieb:
Hallo!
Ich bräuchte ein kleines Script, welches ein Programm startet, alle 5 sek. prüft ob es läuft und es ansonsten ggf. neu startet.
Hat da jemand einen Vorschlag für mich?
Ein paar Tipps:
Mit ps -ef kann man sich eine Prozessliste ausgeben lassen. Mit grep kann man anschließend testen, ob es einen bestimmten Eintrag gibt...
 
Code:
#!/bin/bash
prozesstest=`/bin/ps -A | /usr/bin/grep run.sh`
if  [ $prozesstest = `` ]
then
          /bin/sh /Pfad/zu/run.sh &
fi
jetzt noch:
Code:
chmod u+x /Pfad/zu/dem/obigen/Script
Das ganze in die crontab einfügen:
Code:
*/5    *     *     *     *   "user"  /bin/sh /Pfad/zu/dem/obigen/Script

und schon sollte es laufen.

MFG Havoc
 

styyxx

Member
Du kannst die Abfrage auch gleich ins if setzen:
Code:
if bin/ps -A | /usr/bin/grep run.sh | grep -vq grep

Grüße
styyxx
 
OP
Falkenstein

Falkenstein

Hacker
Prima, Danke, soweit hab ich das.
Nur das mit dem crontab ist noch nicht die Ideallösung, da ich das Programm nach Belieben starten und beenden will.
Dieses Script soll nur dafür sorgen, dass es im Falle eines Absturzes (was leider vorkommt) neu gestartet wird.
 

styyxx

Member
Tach,

im einfachsten Fall kannst du das dann über eine lock Datei machen.
Schreibe die Prozess ID des Programms in eine Datei. Dann setzt du das obige Programm in eine while Schleife die alle z.B. Minute prüft ob der Prozess noch läuft. Zusätzlich überprüfst du ob die z.B. Datei stop_program existiert. Wenn ja wird das Programm mittels eines kill $(cat /pfad/zur/prozess_id_datei) beendet und das check Skript mittels eines exits verlassen.
Du mußt dann nur noch die Datei stop_program mittels eines touch erzeugen und kannst so das Programm beenden.
Zum starten die Datei löschen und das Programm wie gewohnt aufrufen.
So würde ich das zumindest für einen einfachen Fall machen.

Wenn du es elegant haben willst mußt du halt dem Prozess ein Signal schicken und dieses im Programm mittels trap abfangen und dann eine Aufräumfunktion aufrufen die dann natürlich neben dem eigentlichen Programm auch das check Skript beendet.

Grüße
styyxx
 
OP
Falkenstein

Falkenstein

Hacker
So, ich hab mal die Variante mit crontab umgesetzt.

#!/bin/bash

prozesstest=`/bin/ps -A | /usr/bin/grep programm`
if [ $prozesstest = `` ]
then
/bin/sh /usr/local/bin/run.sh &
fi

/usr/local/bin/run.sh: line 4: [: too many arguments

Mit der Zeile
if [ $prozesstest = `` ]
ist er nicht zufrieden.
Wenn ich grep programm in grep irgendwas ändere gehts.
Also ein nichtexistentes Programm da nehme.
Nur das nutzt mir nix, es muss schon exakt grep programm heissen.
 

regexer

Advanced Hacker
tuxx schrieb:
if [ $prozesstest = `` ]
then
/bin/sh /usr/local/bin/run.sh &
fi

/usr/local/bin/run.sh: line 4: [: too many arguments
Zwei Dinge:
1. $prozesstest bitte in Doppelte Hochkommas. Andernfalls läuft der test auf einen Fehler, falls die $prozesstest leer ist
2. Bitte statt den beiden Backticks nach dem istgleich auch doppelte Hochkommas verwenden.
 
Sorry du hast recht ist, vor allem noch ein wesentlich größerer Bug drin, da ps - A | grep programmname auch noch ein Prozess darstellt,
aber dies hier sollte helfen:

Code:
#!/bin/bash 

prozesstest=`/bin/ps -A`
test=`echo $prozesstest | grep programmname | wc -l` 
if [ $prozesstest == 0 ] 
then 
/bin/sh /usr/local/bin/run.sh & 
fi

Das sollte die Lösung des Problems sein!!

MFG Havoc
 
A

Anonymous

Gast
hi,
das waere dann mit einen 5sec check ohne crontab in etwa so ...
Code:
#!/bin/sh
iam=`basename $0`
if [ "$1" == "" ]
        then
        echo $iam /pfad/programm
        echo or
        echo $iam -stop
        exit
fi
if [ "$1" == "-stop" ]
        then
        killall $iam
        exit
fi
if [ "$2" != "-self" ]
        then
        $0 $1 -self&
        exit
fi
pname=`basename $1`
prozesstest=`/bin/ps -A`
while :
        do
        sleep 5
        test=`echo $prozesstest | grep $pname | wc -l`
        if [ $test == 0 ]
                then
                $1
        fi
done
was mich ziemlich an ne fork erinnert :lol:
Mƒg ®êïñï
ps.: ungetestet :shock:
 
OP
Falkenstein

Falkenstein

Hacker
Ich hab mein Glück mit "pidofproc" versucht.
Es scheitert an einem "unary Operator expected" in der rot markierten Zeile.

Sieht aus wie folgt:

#!/bin/sh
iam=`basename $0`
if [ "$1" == "" ]
then
echo $iam /usr/local/bin/program
echo or
echo $iam -stop
exit
fi
if [ "$1" == "-stop" ]
then
killall $iam
exit
fi
if [ "$2" != "-self" ]
then
$0 $1 -self&
exit
fi
pname=`basename $1`
prozesstest=`/bin/ps -A`
while :
do
sleep 5
# testpid=`echo $prozesstest | grep $pname | wc -l`
testpid=`pidofproc -k /usr/local/bin/program`
if [ $testpid == 0 ]
then
$1
fi
done
 
OP
Falkenstein

Falkenstein

Hacker
Denke, das ist richtig gut.
So gefällt mir das.
Und das schöne ist, das man das Skript gleich für mehrere beliebige Programme verwenden kann.
 
A

Anonymous

Gast
jengelh schrieb:
Und wer das Manual gelesen hat, weiß dass man bei Zahlenvergleichen -eq statt == nimmt!

Und wer das Manuel verstanden hatt und eventuell auch das Script, der weis das dies für textfelder total egal und nur nummerische Werte betrifft, im gegenteil sogar bei textfelder stoerend sein kann #fg#
Code:
a=" 1";echo ---------------1----------------;if [ "$a" == "1" ];then echo falsche Abfrage mit '"1"' statt '" 1"' per "==";else echo 'faellt was auf ???,das ist die else und damit RICHTIG!!!';fi;echo ---------------2----------------;if [ "$a" -eq "1" ];then echo falsche Abfrage mit '"1"' statt '" 1"' per "-eq";fi;echo ---------------3----------------;if [ "$a" == " 1" ];then echo richtige Abfrage mit '" 1"' per "==";fi;echo ---------------4----------------;if [ "$a" -eq " 1" ];then echo richtige Abfrage mit '" 1"' per "-eq";fi

Mƒg ®êïñï

Ps.:Lieber Member und nur sinnige Post, die relevant sind #fg#
 
OP
Falkenstein

Falkenstein

Hacker
Eine Kleinigkeit hätt ich da noch:
So sieht das jetzt aus:

#!/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
killall -9 $iam
killall -9 $prog
killall -9 $pname
kill -9 $testpid
exit
fi
if [ "$2" != "-self" ]
then
$0 $1 -self&
exit
fi
pname=`basename $1`
prozesstest=`/bin/ps -A`
while :
do
sleep 5
testpid=`echo $prozesstest | grep $pname | wc -l`
if [ "$testpid" == 0 ]
then
$1
fi
done

Wie kann ich erreichen, dass mit "-stop" nicht nur das Script sondern auch das aufgerufene Programm gekillt werden?
Sonst muss man das Script killen und das Programm zu Fuß beenden, dass muss doch beides mit "-stop" zu machen sein, oder?
Mit meinen "killall" und "kill" oben im Script gehts nicht.
 
Oben