[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Checken, ob ein (Perl-)Skript schon läuft



> Zur selben Zeit kann eine PID natürlich nur einmal existieren. Aber
> zählen die PIDs immer weiter nach oben?

Hängt genau von der implementierung ab. Ich weiß es nicht genau, glaube
bis 32767 und dann fängt es wieder von vorne an. Glaube bei OpenBSD ist
die PID wahl aber zufällig. Kann auch sein das die Grenze höher ist.

> Davon abgesehen: Das Skript könnte ja auch bei einem Reboot abgewürgt
> worden sein. Und dann sind doppelte PIDs auf jeden Fall denkbar.

PID Dateien unter Debian liegen unter /var/run/. Da solltest du sie
ebenfalls ablegen. Wenn dein Programm nicht mit root rechten gestartet
wird solltest du zumindest /tmp/ wählen. Diese verzeichnisse werden
automatisch bei einem start gelöscht.



Aber zu deinen eigentlichen Problem. Das was passieren kann ist das ein
programm abstürzt und die PID Datei nicht korrekt gelöscht wird. Das was
dein programm machen muss ist beim Start zu prüfen ob eine PID vorhanden
ist, wenn ja die PID auslesen die in der PID-Datei steht und prüfen und
schauen ob die PID bereits vergeben ist. Wenn ja, dann prüfen ob das
laufende Programm auch eine Instanz des aktuellen programmes ist, was
meist anhand des Programmnamens gemacht wird.

Ich selber hab nochmal nachgeschaut, ich nutze dazu in der Regel
Proc::PID::File. Hier mal ein Beispiel.

> use Proc::PID::File;
> 
> my $pid = Proc::PID::File->new(verify => 1);
> $pid->file(dir => '/tmp');
> 
> # Prüfen ob prozess schon läuft
> if ( $pid->alive ) {
>     die "Error: Wir laufen schon!\n";
> }
> 
> # Prozess locken
> $pid->touch;
> 
> # Programm arbeitet
> sleep 100;

Wenn du das Programm versuchst zweimal zu starten dann bricht es ab. Die
PID Datei wird im '/tmp/' verzeichniss erstellt.

Wenn du das Programm startest eine PID Datei zwar existiert aber die
dazugehöroge PID ein anderen Programmnamen hat oder gar nicht existiert
dann startet dein programm normal und überschreibt die alte PID.


Reply to: