2008-09-01 13 views
5

Bir yakut komut dosyasının zaten çalışıp çalışmadığını ve sonra uygun şekilde işleyip işlemediğini anlamanın kolay bir yolu var mı? Örneğin: really_long_script.rb adında bir komut dosyası var. Her 5 dakikada bir kaçmaya cüret ettim. Çalışırken, önceki çalışmanın hala devam edip etmediğini görmek ve ikinci komut dosyasının yürütülmesini durdurmak istiyorum. Herhangi bir fikir? Bash olarakBir yakut komut dosyasının çalışıyor olup olmadığını belirleme

cevap

9

ps o ve yarış koşullarına muhtemelen açık yapmanın gerçekten kötü bir yoldur.

Geleneksel Unix/Linux yolu, PID'yi bir dosyaya (tipik olarak/var/run) yazıp, dosyanın başlangıçta olup olmadığını kontrol etmektir.

örn. pidfile /var/run/myscript.pid adresinde bulunur ve programı çalıştırmadan önce var olup olmadığını kontrol edersiniz. Dosya ve sembolik linkleri açmak için O_EXCL (kilitleme hariç) kullanarak yarış koşullarını önlemek için birkaç hile vardır.

Ancak, olasılıkla, dosya sistemindeki atomik işlemleri kullanarak yarış koşullarından kaçınmak için kod yazmayı denemelisiniz.

Tekerleği yeniden keşfetmekten, kendi senaryo kendi kendini temizlemeye olmadan ölürse, yayınlanmaz böylece Muhtemelen de, süreç aslında çalıştığını kontrol etmelidir http://rubyforge.org/projects/pidify/

0

:

if ps aux | grep really_long_script.rb | grep -vq grep 
then 
    echo Script already running 
else 
    ruby really_long_script.rb 
fi 
0

bakmak isteyebilirsiniz kaydetmek için Bir dahaki sefere sadece /var/run/foo.pid'in varlığını ve çıktısını kontrol etmek yerine.

0

Highlander

Açıklama

ana senaryonun yalnızca bir örneğini çalıştıran sağlayan bir mücevher. Kısaca, sadece bir tane olabilir.

require 'highlander' # This should be the -first- thing in your code. 
# Your code here 

arada

Kurulum

gem install highlander 

Özet, geri komut satırında ...

# First attempt, works. Assume it's running in the background. 
ruby your_script.rb 

# Second attempt while the first instance is still running, fails. 
ruby your_script.rb # => RuntimeError 

Notlar Basitçe highlander mücevher gerektiren

tha sağlar t Bu komut dosyasının yalnızca bir örneği yeniden başlatılamaz. Yeniden başlatmayı denerseniz bir RuntimeError yükseltir.

İlgili konular