Wie man um ein Perl-Skript funktionierte nur in einem einzigen Exemplar

Aufgabe

Manchmal müssen Sie schreiben ein Perl-Skript, das startet nur wenn Sie dieses Skript jetzt nicht funktioniert. D.h. garantieren, dass zur selben Zeit läuft nur eine Instanz dieses Skripts.

Zum Beispiel, ein solches Problem kann auftreten, wenn das Skript mit cron gestartet wird jede Minute und manchmal es kann mehr als eine Minute.

Wir sprechen hier über den Fall, wenn das Skript funktioniert nur auf einem Server und muss sicherstellen Ausführung nicht mehr als eine instance-Script auf einer Maschine.

Lösung

Der einfachste Weg, diese Aufgabe zu lösen ist die Verwendung der Perl-Bibliothek Sys::RunAlone.

Die Bibliothek kommt nicht mit Perl, Ihr Sie brauchen, um erweitert.

Um das Skript, das funktioniert nur in einer Instanz, die Sie hinzufügen möchten in das vorhandene Skript use Sys::RunAlone; und __END__.

Hier ist ein Beispielskript, das funktioniert nur in einem Exemplar vorhanden:

#!/usr/bin/perl

use Sys::RunAlone;

print "working\n";

sleep 10;

__END__

Wenn Sie dieses Skript starten, er zeigt den Text working und 10 Sekunden hängen und warten, und dann beendet.

Wenn Sie eine andere Konsole und während das Skript läuft versuchen es noch einmal, dann dieser Start einen Fehler aus, und kein Code aus dem Skript ausgeführt wird:

$ perl script.pl
A copy of 'script.pl' is already running

Block __END__ im Skript ist ein muss. Bibliothek Sys::RunAlone verwendet dieses die Einheit, um die Lok zu nehmen. Und wenn diese Einheit nicht, und die Bibliothek Sys::RunAloneangeschlossen ist, das Skript wird nicht funktionieren, auf dem Bildschirm erscheint Fehler Add __END__ to end of script 'script.pl' to be able use the features of Sys::RunALone.

Andere Artikel