Prüfen, ob Prozess noch läuft

Bash, Shell, PHP, Python, Perl, CGI
skyrunner
Posts: 22
Joined: 2003-10-28 14:35

Prüfen, ob Prozess noch läuft

Post by skyrunner » 2006-10-04 13:26

Hoi,

leider hat die Suchfunktion nichts gebracht, deshalb poste ich es einfach mal hier.

Es geht um folgendes: Ich habe einen Prozess, der dauerhaft läuft. Es handelt sich um PHP CLI. jetzt habe ich bereits ein Shellscript zum starten und stoppen geschrieben. Es wird beim starten eine Datei angelegt, in der die PID des PHP Skripts steht, was gerade läuft. Jetzt möchte ich per Contab alle paar Minuten prüfen, ob der PHP Prozess noch lebt und ihn ggf. neu starten.

Daher meine Frage: Wie finde ich heraus, ob ein Prozess, deren PID ich kenne, läuft?

Grüße
Christoph

skyrunner
Posts: 22
Joined: 2003-10-28 14:35

Re: Prüfen, ob Prozess noch läuft

Post by skyrunner » 2006-10-04 14:35

Lösung schon gefunden:

Code: Select all

echo "cheking...";
        if [ -e manager.pid ]; then
            pid=`cat manager.pid`
            var=`ps -p$pid | wc -l`

            if [ $var -lt "2" ]; then
                ./manager.sh start
            else
                echo "status: running"
            fi
        else
            echo "manager.pid is missing... try starting service... "
            ./manager.sh start
        fi

snowball
Posts: 218
Joined: 2004-09-15 10:14

Re: Prüfen, ob Prozess noch läuft

Post by snowball » 2006-10-04 20:21

mhh,
quick and dirty...
du könntest eine

Code: Select all

ps aux | grep $PID
machen und mal schauen ob dir das weiter hilft.

HTH
Jochen

EDIT:
Aber gab es da nicht mal startproc und checkproc für?
Oder ist das wieder so ne SuSE eigenart?

caput
Posts: 48
Joined: 2005-06-08 02:06

Re: Prüfen, ob Prozess noch läuft

Post by caput » 2006-10-05 21:42

Und das Gegenteil zum Quick and Dirty - der Overkill: monit
monit is a utility for managing and monitoring, processes, files, directories and devices on a UNIX system. Monit conducts automatic maintenance and repair and can execute meaningful causal actions in error situations.
http://www.tildeslash.com/monit/
http://www.tildeslash.com/monit/doc/screen.php

Kann ich nur weiterempfehlen. :wink:

User avatar
isotopp
Posts: 471
Joined: 2003-08-21 10:21
Location: Berlin

Re: Prüfen, ob Prozess noch läuft

Post by isotopp » 2006-10-05 23:37

Skyrunner wrote:Es geht um folgendes: Ich habe einen Prozess, der dauerhaft läuft. Es handelt sich um PHP CLI.
Also, die einfachste Möglichkeit zu prüfen ob ein Prozeß noch läuft oder nicht ist durch seinen Elternprozeß gegeben. Der kann nämlich nach dem Starten die PID vom Kind abfragen und er kann sich schlafen legen und auf den Tod eines seiner Kinder warten.

init macht den ganzen Tag nix anderes.

Die bequemste Methode, einen Prozeß zu starten und bei Tod neu zu starten ist also

Code: Select all

# echo "kk:2345:respawn:/path/to/my/script.php parameter" >> /etc/inittab
# telinit q
Wenn Dir das suspekt ist, kannst Du Dir die Funktionalität von init selber nachbauen:

Code: Select all

kris@linux:~/Desktop> while :
> do
> sleep 10 &
> child=$!
> echo "Sleep for $child"
> wait $child
> echo "Child $child died - restart"
> done
[1] 17692
Sleep for 17692
[1]+  Done                    sleep 10
Child 17692 died - restart
[1] 17698
Sleep for 17698
Manchmal muß man einen Prozeß von außen überwachen. Wenn der Prozeß dann ein PID-File hat, ist das nützlich.

Erst mal kann man die Existenz des PID-File testen.

Code: Select all

if test -e $pidfile
then
  echo "PID-File $pidfile existiert."
else
  echo "PID-File $pidfile gibt es nicht."
fi
Das sagt uns natürlich primär was über das File, nicht den Prozeß aus. Man kann aber natürlich nun ein kill -0 an den Prozeß senden. In der Manpage von "kill(2)" heißt es dazu:
If sig is 0, then no signal is sent, but error checking is still performed.
Das bedeutet: Wenn wir ein kill -0 an eine PID senden, die es nicht gibt, bekommen wir ein ESRCH. Wenn wir ein kill -0 an eine PID senden, die es gibt, die wir aber nicht killen dürften, dann bekommen wir ein EPERM. Und wenn es eine PID gibt, und wir die killen dürften, dann bekommen wir ein ok.

In Shell:

Code: Select all

kris@linux:~> kill -0 1
bash: kill: (1) - Operation not permitted
kris@linux:~> echo $?
1
kris@linux:~> kill -0 16161
bash: kill: (16161) - No such process
kris@linux:~> echo $?
1
kris@linux:~> kill -0 $$
kris@linux:~> echo $?
0
Wir wissen nun, ob die PID aus dem PID-File noch in verwendung ist. Wir wissen aber nicht, welches Programm da gerade Dienst tut.

LSB sieht nun vor, daß ein Program pidofproc oder checkproc existiert, mit dem man

a) ein PID-File lesen kann
b) testet ob die PID aus dem PID-File noch existiert
c) das angegebene Binary zu /proc/<pid>/exe paßt (Inode-Gleichheit)

Die Manpage zu pidofproc dekliniert das im Detail durch.

Code: Select all

linux:~ # rcmysql start
Starting service MySQL                                               done
linux:~ # pidofproc -p /var/lib/mysql/mysqld.pid -v /usr/sbin/mysqld
linux:~ # echo $?
1
linux:~ # rcmysql stop
Shutting down service MySQL                                          done
linux:~ # pidofproc -p /var/lib/mysql/mysqld.pid -v /usr/sbin/mysqld
linux:~ # echo $?
3
linux:~ # rcmysql start
Starting service MySQL                                               done
linux:~ # kill -9 18299 18334
linux:~ # ls -l /var/lib/mysql/mysqld.pid
-rw-rw----  1 mysql mysql 6 Oct  5 23:36 /var/lib/mysql/mysqld.pid
linux:~ # pidofproc -p /var/lib/mysql/mysqld.pid -v /usr/sbin/mysqld
linux:~ # echo $?
1

User avatar
isotopp
Posts: 471
Joined: 2003-08-21 10:21
Location: Berlin

Re: Prüfen, ob Prozess noch läuft

Post by isotopp » 2006-10-05 23:37

snowball wrote:EDIT:
Aber gab es da nicht mal startproc und checkproc für?
Oder ist das wieder so ne SuSE eigenart?
Das ist LSB.