2009-01-18 15 views
23

Bunu yapmanın birkaç yolu var, ancak hangisinin en iyisi olduğundan emin değilim. pgrep kullanarak işlemi içinPerl programının yalnızca bir örneğinin çalıştığından emin olmanın en iyi yolu nedir?

  • Look:

    İşte aklıma gelen şey bu.

  • Komut dosyası, kendiliğinden bir sürü kullanarak kilitlenmesini sağlayın ve her çalıştığında kilitlenip kilitlenmediğini kontrol edin.
  • /var/run/program_name.pid dosyasında bir pid dosyası oluşturun ve var olup olmadığını kontrol edin ve gerekiyorsa teklifleri karşılaştırın.

Bunu yapmak için daha fazla yol vardır. Sizce en iyi yaklaşım hangisidir?

+0

Bash ile ilgili benzer soru: http://stackoverflow.com/questions/455911/whats-the-best-way-to-make-sure-only-one-instance-of-a-perl-program- is-running – codeforester

cevap

34

Bunu yapmanın birçok yolu vardır. PID dosyaları bunu yapmanın geleneksel yoludur. Ayrıca bir program üzerinde, örneğin programın kendisinde bir kilit de tutabilirsiniz. Bu kod küçük bir parça hile olacaktır: PID dosyaları üzerinde

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"; 

bir avantajı dosyaları otomatik olarak program çıkar kilidi elde edilmesi. Güvenilir bir şekilde uygulanması çok daha kolay.

+0

+1: Basit, taşınabilir ve yarış koşulları yok. –

+0

, ActiveState Perl ile iyi çalışmıyor gibi görünüyor ... başka biri denedi? – golimar

+0

+1 Güzel bir çözüm, kodu biraz daha net hale getirmek için biraz parantez eklerdim. İkinci satırdaki bu 'veya' ifadesi sadece 0 $ veya açık ifadenin sonucu üzerinde çalışıyor mu? Sadece bana net bakmıyor. – MikeKulls

9

Eski PID dosya hünerini yapın.

  • başlangıç ​​süreci
  • , eğer öyleyse "myprog.PID"
  • adlı bir dosya olup olmadığını görmek
  • değilse yüksek sesle şikayet ve çıkış "myprog.PID" ve ardından adında bir dosya oluşturmak

HTH

alkış devam

Rob

+5

Bu, PID dosyasını dosyadan okuyarak ve işlemin devam edip etmediğini kontrol ederek geliştirilebilir (kill 0, $ pid kullanarak). Değilse, eski pid dosyasını göz ardı edin ve devam edin. Bu, çökmüş bir süreçten daha incelikli bir şekilde kurtarmaya yardımcı olur. Dosyada bulunan pidin mevcut olup olmadığını kontrol etmek için –

+0

+1, bunun için sadece 0 sinyaliyle öldürün. – Keltia

+2

Aynı zamanda iki işlem aynı anda başlatmayı denediyse, aynı dosyayı kontrol edip bir pid dosyası dosyalamadıysa, bunun da bir yarış durumu olduğunu unutmayın. –

2

Listelediğiniz tüm seçenekler düzgün. Bununla birlikte, bir şey, nadir durumlarda, çok uzun bir süre (yani, bir şey üzerinde bekletilen) bir süreçle sonuçlanabileceğini bilmektir. Diğer çalışan örneğinin ne kadar süredir devam ettiğini ve muhtemelen belirli bir süreyi (belki de bir gün gibi) aşarsa kendinize bir uyarı göndereceğini düşünmek isteyebilirsiniz.

İlgili konular