Ich mag Unix, hab ich das schon mal erwähnt? Alles, was auf der Kommandozeile möglich ist, kann man mit Skripten automatisieren.
Ein Thema beim Erstellen von Shell Skripten ist der Umgang mit Prozessen. Wer schon mal mit einer Unix Shell Bekanntschaft gemacht hat, wird die Befehle ps
und kill
kennen, mit denen man sich eine Übersicht über laufende Prozesse verschafft, bzw. sie beendet. Vielleicht ist auch bekannt, dass man mit kill -9
einem Wunsch einen Prozess zu beenden Nachdruck verleihen kann.
Was weniger bekannt sein dürfte (zumindest mir bis vor kurzem nicht) ist, dass man mit kill -0
auch feststellen kann, ob ein Prozess noch läuft. Denn mit dem Befehl kill kann man einem Prozess auch Signale schicken, zu denen auch schon das vorhin erwähnte Signal 9 gehört.
Alles was man dazu benötigt ist die Prozess ID (pid). Diese erhält man über die Shell Variable $!
. In Zeile 4 des Beipiels wird sie gleich mit dem Start eines Prozesses in einer Variablen abgespeichert. In der darauf folgenden Zeile wird dieser pid dann das Signal 0 über den Befehl kill
gesendet.
Findet der Kernel diese pid in seiner Prozesstabelle erhält man als Returnwert 0, wenn nicht eine 1. So muss man nicht selbst umständlich in der Prozesstabelle suchen.
#!/bin/bash pid="" ./longrun.sh & pid=$! kill -0 $pid 2>/dev/null if [ $? -eq 0 ] then echo "existing process $pid" else echo "no process with pid: $pid" fi exit 0