PDA

Bekijk de volledige versie : verhindern das ein Prozess mehr als 1x gestartet wird



WLAN-Fan
26-06-2008, 10:19
Hi,

ich habe ein Script.sh was mir ein Programm per Cron jede Minute aufruft.

Ich möchte das Script erweitern um die Funktion:
zu prüfen ob das Programm schon läuft und wenn ja das laufende Programminstanz killed und dann das Programm neu startet.

Wie würdet ihr das machen mit ps | grep programm ?

Danke.

thE_29
26-06-2008, 10:30
Schwups wups:


#!/bin/sh
# if flag file exists, check also the process via ps
CHECK_ALSO_PROCESS=1
# program details
FETCH_PROG=test2.sh
FULL_PROG=/tmp/disk1/tmp/test2.sh
FLAG_FILE=/tmp/disk1/tmp/digitemp.flg

# is the program running or not, default = NO == 1 - dont touch this!
RUN_PROG=1

# if file exists, check the process
if [ -f $FLAG_FILE ] ; then
# if file exists, check if we want to look for the process via ps
if [ $CHECK_ALSO_PROCESS -eq 1 ] ; then
catch=`/bin/ps | grep $FETCH_PROG | grep -v grep -c`
# if it is greater than 1, then the program is running - nothing todo
if [ $catch -ge 1 ] ; then
RUN_PROG=0
else
echo "Flag file ($FLAG_FILE) exists, but program ($FETCH_PROG) is not running! Program will be executed!"
fi
fi
fi

# if program should be executed
if [ $RUN_PROG -eq 1 ] ; then
touch $FLAG_FILE
echo "Starting program: $FULL_PROG"
$FULL_PROG

# remove the flag file
rm $FLAG_FILE
# return not 0, because its an error
else
return 2
fi

thE_29
26-06-2008, 11:06
Und hier noch mit den Parameter als Übergabe ans Programm!

./runner.sh Programm_Name Voller_Pfad_zum_Programm Flag_file_Name


#!/bin/sh
if [ -z $1 ] || [ -z $2 ] || [ -z $3 ] ; then
echo -e "Wrong Usage!\nUsage: $0 PROG_NAME FULL_PROG_PATH FLAG_FILE"
return 3
fi

# if flag file exists, check also the process via ps
CHECK_ALSO_PROCESS=1
# program details
FETCH_PROG=$1
FULL_PROG=$2
FLAG_FILE=$3

# is the program running or not, default = NO == 1 - dont touch this!
RUN_PROG=1

# if file exists, check the process
if [ -f $FLAG_FILE ] ; then
# if file exists, check if we want to look for the process via ps
if [ $CHECK_ALSO_PROCESS -eq 1 ] ; then
# dont grep the grep cmd and also not the scripts name, because the fetch program name is a parameter
catch=`/bin/ps | grep $FETCH_PROG | grep -v grep | grep -v $0 -c`
# if it is greater than 1, then the program is running - nothing todo
if [ $catch -ge 1 ] ; then
RUN_PROG=0
else
echo "Flag file ($FLAG_FILE) exists, but program ($FETCH_PROG) is not running! Program will be executed!"
fi
fi
fi

# if program should be executed
if [ $RUN_PROG -eq 1 ] ; then
touch $FLAG_FILE
echo "Starting program: $FULL_PROG"
$FULL_PROG

# remove the flag file
rm $FLAG_FILE
# return not 0, because its an error
else
return 2
fi

wengi
26-06-2008, 12:24
Na da kopier ich doch Dein eigenes script aus dem anderen thread und nehme das ! raus:
#!/bin/sh
#feel free to copy and/or modify

Processname=busybox_httpd
if [ -n "`pidof $Processname`" ] ; then #when Processname is in pid list
echo -n Killing: $Processname
kill `pidof $Processname`
echo -n Starting: $Processname
exec $Processname
fi das hab ich jetzt trocken gemacht. Müsste prinzipiell funktionieren. getestet ist es, wie gesagt, nicht.

wengi

thE_29
26-06-2008, 14:25
Och!

Wusste gar nicht das pidof den Prozessname als Parameter kann! Wieder was gelernt ;)

newbiefan
26-06-2008, 21:25
Eigentlich absoluter Quatsch - kein Mensch killt und startet jede Minute den Webserver neu oder auch einen anderen Prozess - weder fuer intern od. extern........
Die Webseite moechte ich in Funktion sehen.... lol :eek::eek:

Aber wie auch immer, Wengi liegt eben meiner Meinung nach wieder einmal voellig richtig und wie man sieht auch im trockenen = ohne Kastl!!

Jedenfalls gibts auch fuer WLANfans Trickkiste ein kurzes Beispiel:



#!/bin/sh
#feel free to copy and/or modify
# example: ./startprocess httpd -xy -p777 /www/meins /sonstnochirgendwas

echo "Es sind " $# "Argumente mitgegeben worden"

if [ -n "`pidof $1`" ] ; then #when Processname is in pid list
echo Killing: $1 at `date`
kill `pidof $1`
echo Starting: $1 at `date` with parameter: $2 $3 $4 $5 $6
exec $* &
fi
echo $1 $2 $3 $4 $5 $6
echo ist das Gleiche wie $* (einfach alle 6 uebergebene Argumente)
echo Der Name von diesem Script: $0


Naja wennst jetzt noch die echos wegnimmst, wird das ganze Ding unheimlich kurz....und natuerlich uebersichtlich.
So, hoffentlich gehts, denn das war auch ohne probieren.....

thE_29
27-06-2008, 07:38
Jo, warum WLAN-FAN sich soviele sorgen macht das der Prozess abstürtzt verstehe ich zwar auch nicht.. Aber tjo ;)

Mein Router läuft jetzt seit 122 Tagen und es ist kein einziger Prozess abgestürzt..

newbiefan
27-06-2008, 21:03
Jo, warum WLAN-FAN sich soviele sorgen macht das der Prozess abstürtzt verstehe ich zwar auch nicht.. Aber tjo ;)

Mein Router läuft jetzt seit 122 Tagen und es ist kein einziger Prozess abgestürzt..

Jaja das verstehe ich gar nicht mehr, aber wenn man schon in Sorge ist, dann kontrolliere ich hoechstens, ob das Progi laeuft, wieso killen und dann starten, wenn das Progi laeuft iss ja ohnehin gut.....