2010-11-24 4 views
1

Ich möchte sicherstellen, dass jeweils nur ein Prozess ausgeführt wird. Ich möchte sicherstellen, dass JobB nicht ausgeführt wird, es sei denn, JobA läuft nicht.Welches CPAN-Modul für nicht blockierende Dateisperrung mit Perl verwenden soll

Es wäre großartig, wenn es eine gewisse Fähigkeit hätte, die Sperre erneut zu versuchen, also muss ich das nicht programmieren. Etwas vage wie folgt:

LockFileModule->lock(
    lockfile   => '/fabulous/pants', 
    retries   => 12, 
    timeout   => 25, 
    timebetweenretries => 30, 
) or die "the other job is still running"; 

Was ist der beste Weg, dies in Perl zu tun? Ich hoffe, dass es dafür ein gutes CPAN-Modul gibt.

+2

Funktioniert 'flock' nicht? – tchrist

+0

Ja, es ist einfach und funktioniert gut. Aber es versucht nicht das Schloss. Wahrscheinlich sollte ich es saugen und die vier Codezeilen schreiben, um die Schleife zu machen. –

Antwort

2
#!/usr/bin/perl 
unless (flock(DATA, LOCK_EX|LOCK_NB)) { 
    $logger->info("$0 is already running. Exiting.\n"); 
    exit(1); 
} else { 
    $logger->info("$0 not already running, so starting instance now."); 
} 

__DATA__ 
Do not delete this. Used for flock code above 

Dies verriegelt die DATA Abschnitt des Programms selbst. Ich benutze diese Technik und es funktioniert sehr gut.

Sie können es erweitern, um Wiederholungen ziemlich einfach zu ermöglichen.

+0

hmm wird das funktionieren, wenn das Programm auf NFS gehostet wird? –

+0

NFS hängt von der Implementierung von NFS ab. Im Allgemeinen, ja. – Brock

Verwandte Themen