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