$check = LoxBerry::System::lock([lockfile => 'lockname'], [wait => $seconds]);


Erstellt ein Lock-File, das die PID des laufenden Prozesses enthält. Dieses Lock-File kann nur erstellt werden, wenn keine wichtigen Systemprozesse laufen. Es ist möglich, eine angegebene Zeit abzuwarten, sollte der Lock nicht freigegeben sein.

Übergeben wird ein lockname ohne Pfad und Dateierweiterung.

Die Funktion geht bei der Ausführung folgendermaßen vor:

  1. Es wird die Datei $lbsconfigdir/lockfiles.default ausgelesen, die alle Namen der Lockfiles enthält, die zum Zeitpunkt dieses Locks nicht laufen dürfen.
  2. Für alle diese Lockfiles wird geprüft, ob deren PID noch existiert. 
  3. Existiert diese PID noch, wird entweder im Intervall 5 Sekunden die optionale Zeit wait => <Sekunden> gewartet, oder als String der gelockte Prozess zurückgegeben.
  4. Existiert die PID nicht mehr, wird versucht, das entsprechende Lock-File zu entfernen, wenn ausreichend Dateirechte vorhanden sind.
  5. Nachdem die Liste aller Lockfiles abgearbeitet wird, wird der optionale lockfile => 'lockname' erzeugt.
  6. Auch hier wird, abhängig von wait, entweder wiederholt versucht zu locken, oder im Fehlerfall sofort der Lockname als String zurückgegeben.

Zusammenfassend

Zum Entsperren wird LoxBerry::System::unlock( lockfile => 'lockname'); verwendet, siehe LoxBerry::System::unlock.

Debugging

Generell können in den LoxBerry Perl-Modulen Debugging-Meldungen für alle Funktionen aktiviert werden, die dann ins Errorlog (STDERR) geschrieben werden:

$LoxBerry::System::DEBUG = 1;

Für diese Funktion gibt es sehr detaillierte Debugging-Meldungen.

Verwendung

use LoxBerry::System;
 
# Locks lbupdate and immediately returns, if it cannot lock
my $status = LoxBerry::System::lock(lockfile => 'lbupdate');
if ($status) {
	print "Could not lock, prevented by $status";
} else {
	print "Lock was successful";
}


# Locks myprocedure and will retry it for 10 minutes, if it cannot lock
my $status = LoxBerry::System::lock(lockfile => 'myprocedure', wait => 600);


# Only checks, if important files are locked, and immediately returns
my $status = LoxBerry::System::lock();
if ($status) {
	print "$status currently running - Quitting.";
	exit;
}

Known Issues und Informationen

Siehe auch

LoxBerry::System::unlock