Dakikada cron, sadece tek bir örnek sağlar


9

Bir komut dosyasını her dakika (veya 2 veya 5 vb.) Çalıştırmanın bir yolu var mı, ancak yalnızca zaten çalışmıyorsa?

Her dakika çalışması gereken bir dizi komut dizimiz var. Bazen bir saniye içinde başlayıp bitebilirler, diğer zamanlarda 5 dakika sürebilirler.

Eşzamanlı yürütmelerden kaçınmanın şu andaki yolu, is_runningher komut dosyasında bir bayrak ayarlamak ve hala etkinleştirilmişse çıkmaktır. Ancak bu biraz güvenilmezdir (yani, ölümcül hatalar, komut dosyası durdurulduktan sonra bile bayrağın etkin kalmasına neden olur).

Kendi küçük menajerimizi yazabiliriz, ama zaten var olan daha şık bir çözüm olup olmadığını merak ediyorum.


+1 Bununla da ilgileniyorum. Cevabı bilmiyorum, ancak olası çözümlerle ilgileniyorum.
Saif Bechan

Bir dakika cron "beni bir daemon olun" çok kokuyor
AD7six

Yanıtlar:


9

daha iyi bir yol flockpidfile yerine kullanmaktır . manpage'i kontrol edin: sürü (1) . Avantajı, bir işlem nasıl bitirse / ölse de, kilidin onunla birlikte gitmesidir.


3

Warner'ın pid dosyası cevabını kabul etme eğilimindeydim. Ancak, Anacron'un aşağıdaki özelliği bunu başarıyor mu?

-s
    Serialize execution of jobs. Anacron will not start a new job before the previous one finished. 

Kendim test etmedim, anacron'un belgelerini yeterince kapsamlı bulamıyorum ...

Özellikle tembel olmak istiyorsanız ;-) Sadece ps çıkış yoluyla greping süreci çalışan olarak döndürürse komut dosyası çıkışı olabilir. Ancak bir kilit / pid dosyası en iyisidir.


anacron, cron'un daha yeni bir versiyonudur, bu nedenle eski standarttan daha fazla özelliğe sahiptir. 'nasıl' hakkında, muhtemelen bir alt süreç öldüğünde tetiklenen bir SIGCHLD işleyicisini kaydeder. böylece çalışan çocukları takip edebilir ve bu işleri atlayabilir.
Javier

@ Javier: "Anacron cron'un daha yeni bir versiyonudur, bu yüzden eski standarttan daha fazla özelliğe sahiptir." Ne anacronile ne arasında bir örtüşme cronvar, ama farklı sorunları çözüyorlar. Kullanarak cron, bir makine çalışmadığı için kaçırılan bir işe nasıl başlayacaksınız? Kullanarak anacron, her 25 Aralık'ta veya 5 dakikada bir işe nasıl başlarsın? (Elbette komut dosyaları geçici çözümlerini kullanabilirsiniz, ancak bahsettiğim bu değil.)
sonraki duyuruya kadar duraklatıldı.

@Kyle: Bu seçenek, zamanlanan farklı işlerin aynı anda çalışmasına neden olur. OP'nin ihtiyacı için işe yarayabilir, ancak diğer işleri veya diğer işleri engelleyebilir. Ayrıca, anacronbir günden daha kısa dönemlerde çalışmaz.
sonraki duyuruya kadar duraklatıldı.

@Dennis Williamson: Sanırım haklısın, tarih ayrıntılarını kontrol etmedim. Ama yine de sanırım cron kurulduktan sonra başlamış olan anacron projesinin kabul edildiğini ve bundan ilham aldığını; bu nedenle, cron'un sahip olmadığı özelliklere sahip olması şaşırtıcı değildir. Ayrıca, asıl soru cron hakkındaydı
Javier

1

Bu yaklaşım için doğru çözüm budur. Genellikle, bir pid dosyası kullanılır ve çalıştığından emin olmak için işleme karşı bir pid testi yapılır. Eskiyse, kilit dosyası kaldırılır ve işlem yine de çalışır.

Herhangi bir ek zeka, cron içinde çalışmanın aksine, tipik olarak yazılımın içinde bir daemon olarak yazılır.


1

Komut dosyalarınız flock (2) sistem çağrısını destekleyen bir dilde kodlanmışsa, bir işlev çağrısıyla kilit dosyasını flock () edebilirsiniz. Misal:

Bash veya bunu desteklemeyen başka bir komut dosyası dili ile sıkışmışsanız, flock (1) ile zaten önerilen çözüm de iyidir.

PS Her durumda, ayrı bir kilit dosyası yalnızca bir kez (zaten yoksa) oluşturmalı ve asla silmemelisiniz. "/ Var / lock" dizini bu tür dosyalar için iyi bir yerdir.


0

Eğer betiğiniz python ile çalışıyorsa (veya bir sonraki komuttan önce çalıştırmak için bir python komutu oluşturabilirseniz) bir çözümdür - Geçen hafta bu kesin problemle karşılaştım ve bazı iyi çözümler bulmama rağmen, çok basit ve temiz python paketi ve PyPI'ye yükledi. Kilitlemek __file__için özel bir kaynak adı vermeyi düşünmek zorunda kalmamak için kesinlikle kilitleyebilirsiniz.

Yükleme yeri: pip install quicklock

Bunu kullanmak son derece basittir:

[nate@Nates-MacBook-Pro-3 ~/live] python
Python 2.7.6 (default, Sep  9 2014, 15:04:36)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from quicklock import singleton
>>> # Let's create a lock so that only one instance of a script will run
...
>>> singleton('hello world')
>>>
>>> # Let's try to do that again, this should fail
...
>>> singleton('hello world')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/nate/live/gallery/env/lib/python2.7/site-packages/quicklock/quicklock.py", line 47, in singleton
    raise RuntimeError('Resource <{}> is currently locked by <Process {}: "{}">'.format(resource, other_process.pid, other_process.name()))
RuntimeError: Resource <hello world> is currently locked by <Process 24801: "python">
>>>
>>> # But if we quit this process, we release the lock automatically
...
>>> ^D
[nate@Nates-MacBook-Pro-3 ~/live] python
Python 2.7.6 (default, Sep  9 2014, 15:04:36)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from quicklock import singleton
>>> singleton('hello world')
>>>
>>> # No exception was thrown, we own 'hello world'!

Bir göz atın: https://pypi.python.org/pypi/quicklock

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.