2009-01-18 9 views
23

Istnieje kilka sposobów, aby to zrobić, ale nie jestem pewien, który z nich jest najlepszy.Jaki jest najlepszy sposób, aby upewnić się, że działa tylko jedna instancja programu Perl?

Oto co mogę myśleć:

  • spojrzeć na proces używając pgrep.
  • Skrypt blokuje się za pomocą stada, a następnie sprawdza, czy jest blokowany przy każdym uruchomieniu.
  • Utwórz plik pid w /var/run/nazwa_programu.pid i sprawdź, czy istnieje, i porównaj pid, jeśli to konieczne.

Prawdopodobnie jest na to więcej sposobów. Jakie jest według Ciebie najlepsze podejście?

+0

Podobne pytanie, o Bash: http://stackoverflow.com/questions/455911/whats-the-best-way-to-make-sure-only-one-instance-of-a-perl-program- jest uruchomiony – codeforester

Odpowiedz

34

Istnieje wiele sposobów, aby to zrobić. Pliki PID to tradycyjny sposób na zrobienie tego. Możesz także przytrzymać plik, na przykład sam program. Ten niewielki fragment kodu wystarczy:

use Fcntl ':flock'; 
open my $self, '<', $0 or die "Couldn't open self: $!"; 
flock $self, LOCK_EX | LOCK_NB or die "This script is already running"; 

Jedną z zalet w stosunku do plików PID jest fakt, że pliki są automatycznie odblokowywane po wyjściu programu. Znacznie łatwiej jest wdrożyć w niezawodny sposób.

+0

+1: proste, przenośne i bez warunków wyścigowych. –

+0

wydaje się nie działać dobrze z ActiveState Perl ... ktoś inny próbował go? – golimar

+0

+1 Przyjemne rozwiązanie, chociaż dodałem kilka nawiasów, aby kod był trochę bardziej przejrzysty. Czy to "lub" w drugim wierszu działa tylko 0 $ lub wynik otwartego wyciągu? Po prostu nie wydaje mi się to jasne. – MikeKulls

9

Wykonaj starą sztuczkę pliku PID.

  • proces startu
  • sprawdzić, czy istnieje plik o nazwie „myprog.PID”
  • jeśli tak, skarżą się głośno i wyjście
  • jeśli nie, utwórz plik o nazwie „myprog.PID”, a następnie kontynuować

HTH

okrzyki,

Rob

+5

Można to poprawić, odczytując PID z pliku i sprawdzając, czy proces nadal istnieje (za pomocą kill 0, $ pid). Jeśli nie, zignoruj ​​stary plik pid i kontynuuj. Pomaga to w szybszym odzyskaniu sprawności po awarii. –

+0

+1 dla sprawdzenia, czy pid znaleziony w pliku istnieje, zabij z sygnałem 0 istnieje właśnie w tym celu. – Keltia

+2

Należy zauważyć, że ma to również warunek wyścigowy, jeśli dwa procesy próbują uruchomić w tym samym czasie, sprawdź plik pod tym samym kątem i nie plik pid. –

2

Wszystkie wymienione opcje są w porządku. Jedną z nich jest jednak świadomość, że w rzadkich przypadkach może się zdarzyć, że proces będzie działał przez bardzo długi czas (tj. Zatrzymany, czekając na coś). Warto zastanowić się, jak długo działa uruchomiona instancja i ewentualnie wysłać alert, jeśli przekracza on pewną ilość czasu (np. W ciągu dnia).

Powiązane problemy