Bir işin uzun sürdüğü birden fazla cron işi çalıştırın


17

Cron işleri ile ilgili aşağıdaki genel sorum var.

Yaşıyorum benim, aşağıdakileri olduğunu varsayalım crontab:

* 10 * * * * someScript.sh
* 11 * * * * someScript2.sh
30 11 */2 * * someScript3.sh  <-- Takes a long time let's say 36 hours.
* 12 * * * someScript4.sh

Kalan işleri uygun zamanlarda çalıştırmak için yeterince akıllı mı? Örneğin, uzun komut dosyasının sonlanması gerekmez mi?

Ayrıca, ilk uzun komut dosyası hala çalışıyorsa ve cron tarafından tekrar çağrılırsa ne olur?

Teşekkür ederim!


Cron işlerin ne kadar süreceğini umursamıyor; ek kopyalar çalıştıracaktır.
Jeff Schaller

Lütfen sorularınızın doğru biçimlendirildiğinden emin olun.
Bram

Yanıtlar:


32

Her cron işi, belirtmiş olabileceğiniz diğer işlerden bağımsız olarak yürütülür. Bu, uzun ömürlü komut dosyanızın diğer işlerin belirtilen zamanda yürütülmesini engellemeyeceği anlamına gelir.

Komut dosyalarınızdan herhangi biri hala bir sonraki zamanlanmış cron aralığında yürütülüyorsa, komut dosyanızın eşzamanlı başka bir örneği yürütülür.

Betiğinizin ne yaptığına bağlı olarak bunun öngörülemeyen sonuçları olabilir. Dosya Kilitleme hakkındaki Wikipedia makalesini , özellikle Dosyaları kilitle bölümünü okumanızı tavsiye ederim . Bir kilit dosyası, bir kaynağın (sizin durumunuzda someScript3.shkomut dosyası) şu anda 'kilitli' (yani kullanımda) olduğunu ve kilit dosyası kaldırılıncaya kadar yeniden yürütülmemesi gerektiğini bildiren basit bir mekanizmadır .

Komut dosyanızda bir kilit dosyasını uygulama yollarının ayrıntıları için aşağıdaki sorunun yanıtlarına göz atın:


8

Ne zaman kastettiğinizden emin değilim. Cron planlanan zamanda işe başlayacaktır. Zamanlanan diğer işleri veya bir işin diğer örneklerini denetlemez.

Böylece tanımladığınız geçerli işler ne zaman tanımlanırsa başlatılır. Tanımlanan aralıktan daha uzun süre çalışan her iş birden çok kez başlatılır. Gerekirse, işi kim yazmışsa, işin birden çok kez çalışmasını engellemek onun sorumluluğundadır. Örneğin bir kilit dosyasını veya PID dosyasını ya da başka bir şeyi kontrol ederek.

Paralel olarak çalışabilecek süreçlerin miktarında bariz sınırlamalar vardır, ancak bunlar crona özgü değildir.


6

Diğer yanıtlara ek olarak, özellikle @soulcake tarafından gönderilen bağlantı: Çok kısa bir aralıkla uzun süre çalışan bir komut planlıyorsanız, cron birincisi tamamlanmadan önce ikinciyi mutlu bir şekilde yürütür (komutta bir tür muteks uygulanmadığı sürece) .

Bu genellikle orijinal komutu daha da yavaşlatır ve önceki komutlar tamamlanmadan önce başka bir örneğin çalıştırılmasına neden olur. Ya da başka nedenlerle istenmeyen olabilir.

Önlemenin genel yolu, komutun önceki bir komutun çalışmadığından emin olan bir korumayla çalıştırılmasını sağlamaktır. Örneğin:

10 * * * * pgrep my_slow_command >/dev/null || /usr/local/bin/my_slow_command

Pgrep komutunun çalıştığında komutun adıyla eşleştiğinden emin olun, örneğin python komut dosyalarında yürütülebilir dosya adı olarak python vardır, bu muhtemelen yeterince spesifik değildir ve python komut dosyasının adıyla da eşleşmeniz gerekir.

10 * * * * pgrep -f my_script.py || /usr/local/bin/my_script.py

('-f' seçeneği olmayan pgrep bash komut dosyası adlarıyla eşleşir)

Pgrep'i herhangi bir nedenle kullanamıyorsanız:

10 * * * * ps ax | grep [m]y_command || /usr/local/bin/my_command

Köşeli ayraçlar grep komutunun kendisiyle eşleşmesini önlemek için kullanılır.


0

Ben kullanıyorum flock.

* * * * * exec flock --nonblock .ws_client.lock -c ws_client.py >& /tmp/ws_client.out
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.