Prozess-Ueberwachungs-Script

Re: Nützliche bash Skripte

Dann sieht das so aus:

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
 		if ! ps -A | fgrep -w "$pname" >/dev/null
 			then
 				$1
				pidofproc -k "$iam" >> /tmp/.loeschpid
 				pidofproc -k "$pname" >> /tmp/.loeschpid
 				echo $$ >> /tmp/.loeschpid
 			exit
 		fi
 done


Geht irgendwie nicht.
Das aufgerufene Programm wird nicht beendet.
 
Zuletzt bearbeitet:
Re: Nützliche bash Skripte

[wird immer mehr off-topic]
Du mußt schon etwas mehr Informationen liefern. Lösch mal die Datei nicht beim -stop sondern kuck dir die an (vorher - nachher). Welche PIDs stehen da drin, welche PID hat das laufende Programm, funktioniert es wenn du der PID per hand mit kill -9 ein Signal sendest? Ich kenne das Programm pidofproc nicht und weiß auch nicht wie es arbeitet. Evtl. solltest du auch mal nach dem Programmstart warten bevor du pidofproc aufruftst (das Programm scheint ja ein Daemon zu sein(?) und evtl. fork'ed es in den Hintergrund? Dann hat es natürlich eine andere PID).

Gruß
 
pidofproc gabs zur SuSE 10.0.
Es liefert eigentlich recht zuverlässig z.B. bei
"pidofproc -k amavisd"
5915 5914 5650
Nur in diesem Fall läuft es nur mit der blauen Zeile, mit der roten gehts nicht.
Ich schau schon immer in .loeschpid, jedoch ist es entweder leer oder es wird nur die erste PID geschrieben.
Hab das grade mal mit edonkey getestet.
Das Script heisst dabei edonkey2006.
Aufgerufen mit "edonkey2006 edonkey2000".
Kein verwertbarer Output, keine PID´s.
Hab auch mal pidofproc durch ps ersetzt, geht auch nicht...
ps -ax| grep $pname|grep -v grep|awk '{print $1}' >> /tmp/.loeschpid
Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
Aufruf: grep [OPTION]... MUSTER [DATEI]...
»grep --help« gibt Ihnen mehr Informationen.

Code:
  #!/bin/sh
  iam=`basename $0`
  prog='/usr/local/bin/edonkey2006'
  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="pidofproc -k $pname"
 		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 $iam|grep -v grep|awk '{print $1}' >> /tmp/.loeschpid
#				pidofproc -k "$iam" >> /tmp/.loeschpid
#				pidofproc -k "$pname" >> /tmp/.loeschpid
  				echo "$testpid" >> /tmp/.loeschpid
  				echo $$ >> /tmp/.loeschpid
  		fi
  done
 
Zuletzt bearbeitet:
tuxx hat gesagt.:
Hab auch mal pidofproc durch ps ersetzt, geht auch nicht...
ps -ax| grep $pname|grep -v grep|awk '{print $1}' >> /tmp/.loeschpid
Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
Aufruf: grep [OPTION]... MUSTER [DATEI]...
»grep --help« gibt Ihnen mehr Informationen.
Das kann so auch nicht gehen, da es bei ps keine -ax Option gibt, was du meintest war vermutlich "ps ax".

Und ist das Programm was du startest denn nun ein Daemon Programm - bzw. benutzt es fork um in den Hintergrund zu treten oder nicht?

Wenn das Programm ein "normales" Programm ist, dann hält das Bash Skript an der Stelle
Code:
if [ "$testpid" == 0 ]
  			then
  				$1
an und wartet bis das gestartet Programm fertig ist. Selbstverständlich stehen dann keine PIDs in der Datei wenn der Shell Interpreter dann da ein kill Signal erhält.

Hast du denn mal probiert das den Shell-Interpreter mit -x bzw. -v zu starten? Was kam dabei raus?

Gruß
 
pidofproc scheint laut manpage ein normales Programm zu sein und gehört zu checkproc und killproc.
Wie gesagt, mit viel Hilfe, das Sciprt ist nicht von mir, ich feil nur dran rum.
Hast du "pidof"? Ich versuch es grade damit und mit -x -v.

Mit diesem ganzen ps und grep scheint mir umständlicher zu sein.

tuxx@linux:~> edonkey2006 edonkey2000
#!/bin/bash --verbose

rm -f /tmp/.loeschpid
iam=`basename $0`
basename $0
prog='/usr/local/bin/edonkey2006'

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
#!/bin/bash --verbose

rm -f /tmp/.loeschpid
iam=`basename $0`
basename $0
prog='/usr/local/bin/edonkey2006'

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`
basename $1
prozesstest=`/bin/ps -A`
tuxx@linux:~> /bin/ps -A
touch /tmp/.loeschpid

while :
do
sleep 5
testpid=`echo $prozesstest | grep $pname | wc -l`
if [ "$testpid" == 0 ]
then
echo $$ >> /tmp/.loeschpid
pidof "$iam" >> /tmp/.loeschpid
pidof "$pname" >> /tmp/.loeschpid
$1
fi
done
echo $prozesstest | grep $pname | wc -l

linux:/tmp # cat .loeschpid
15456


15456


15456


linux:/tmp #

Das Script dazu:
Code:
linux:/usr/local/bin # cat edonkey2006
#!/bin/bash --verbose

rm -f /tmp/.loeschpid
iam=`basename $0`
prog='/usr/local/bin/edonkey2006'

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`
touch /tmp/.loeschpid

while :
		do
		sleep 5
		testpid=`echo $prozesstest | grep $pname | wc -l`
		if [ "$testpid" == 0 ]
			then
				echo $$ >> /tmp/.loeschpid
				pidof "$iam" >> /tmp/.loeschpid
				pidof "$pname" >> /tmp/.loeschpid
				$1
		fi
done
 
Zuletzt bearbeitet:
tuxx hat gesagt.:
pidofproc scheint laut manpage ein normales Programm zu sein und gehört zu checkproc und killproc.
Ich meine nicht pidofproc, ich meine dein Programm welches du aufrufen willst, was unter der Kontrolle des Shell Skripts laufen soll (in deinem letzen Beispiel also edonkey2000) - ist das ein Daemon Programm oder nicht?!

tuxx hat gesagt.:
Code:
echo $$ >> /tmp/.loeschpid
pidof "$iam" >> /tmp/.loeschpid
pidof "$pname" >> /tmp/.loeschpid
$1
Jetzt hast du ja die Reihenfolge vertauscht? Was soll das denn? Wenn das Programm noch gar nicht gestartet ist, dann kann pidof wohl kaum eine PID von dem Programm finden, oder?

Dann wird ein Shellskript durch die Shell ausgeführt, d.h. da läuft irgendwo ein "sh" Prozess mit dem Skriptnamen als ersten Parameter - es gibt also keinen edonkey2006 Prozess. Aber die PID von dem Skript(Interpreter) hast du bereits in $$.

Gruß
 
Mach einfach:
Code:
#!/bin/bash
mkdir -p /var/run/runner
echo $$ > /var/run/runner/parent.pid
while true; do
  $1 &
  echo $! > /var/run/runner/child.pid
  wait $!
done
Und
Code:
#!/bin/bash
kill -9 `cat /var/run/runner/parent.pid`
kill -2 `cat /var/run/runner/child.pid` # Signal anpassen
 
Zuletzt bearbeitet:
Dank dir, der Tip ist gut.
Leider klappte das mit dem Stoppen nur zwei,dreimal danach nicht mehr.
Das Script sieht nun so aus:

Code:
linux:/usr/local/bin # cat edonkey2006
#!/bin/bash

rm -f /tmp/.loeschpid
iam=`basename $0`
prog='/usr/local/bin/edonkey2006'

if [ "$1" == "" ]
		then
		echo $iam $prog
		echo or
		echo $iam -stop
		exit
fi

if [ "$1" == "-stop" ]
	then
		kill -9 `cat /var/run/runner/parent.pid`
		kill -9 `cat /var/run/runner/child.pid`
	exit
fi

if [ "$2" != "-self" ]
		then
		$0 $1 -self&
		exit
fi

mkdir -p /var/run/runner
echo $$ > /var/run/runner/parent.pid
	while true; do
		$1 &
		echo $! > /var/run/runner/child.pid
		wait $!
	done

Jetzt muss ich zum Killen wieder die unelegante Lösung benutzen:
Ein Keyboardshortcut mit "killall edonkey2000 && killall edonkey2006".
Aber wo ist der Fehler im Script?
Läuft doch alles ganz gut durch!
 
Ok, sorry, es funktioniert. :)
Ich war nur etwas ungeduldig, das Beenden dauert einen Augenblick.
 
Zurück