Jak zrobić aby skrypt Perla pracował tylko w jednym egzemplarzu

Zadanie

Czasami trzeba napisać skrypt Perla, który uruchamia się tylko jeśli ten sam skrypt już nie działa. Czyli zagwarantować, że w jednym momencie działa tylko jeden odmiana tego skryptu.

Na przykład, taki problem może wystąpić, jeśli skrypt jest uruchamiany po koronę w każdej minucie i czasami może pracować więcej niż minutę.

Tu mówimy o przypadku gdy skrypt działa tylko na jednym serwerze i trzeba zagwarantować wykonanie nie więcej niż jednej instancji skryptu na jednej maszynie.

Rozwiązanie

Najprostszym sposobem, aby rozwiązać to zadanie to wykorzystać Perl biblioteki Sys::RunAlone.

Biblioteka nie idzie w parze z Perl, trzeba ją umieścić dodatkowo.

Aby zrobić skrypt, który działa tylko w jednym egzemplarzu, trzeba dodać w istniejący skrypt use Sys::RunAlone; i __END__.

Oto przykład skryptu, który działa tylko w jednym egzemplarzu:

#!/usr/bin/perl

use Sys::RunAlone;

print "working\n";

sleep 10;

__END__

Jeśli uruchomić ten skrypt, to on wyprowadzi na ekran tekst working i 10 sekund będzie wisieć i czekać, a potem zakończy pracę.

Jeśli otworzyć inną konsolę i jeszcze ten skrypt działa spróbować uruchomić go jeszcze raz, ten startup wyświetli błąd i żaden kod ze skryptu wykonane nie będzie:

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

Blok __END__ w skrypcie jest obowiązkowe. Biblioteka Sys::RunAlone wykorzystuje ten blok aby wziąć lok. I jeśli tego bloku nie ma, a biblioteka Sys::RunAlonejest podłączony, to skrypt nie będzie działać, na ekranie pojawi się błąd Add __END__ to end of script 'script.pl' to be able use the features of Sys::RunALone.

Inne artykuły