Crond beş dakikalık zamanlamayı mahsup etti


22

Her 5 dakikada bir çalışacak şekilde ayarlanmış bir cron betiğini dengelemek mümkün mü?

İki betiğim var, betiği 1 bir veritabanından bazı verileri toplar ve onu diğerine ekler, betiği 2 bu verileri çıkarır ve diğer birçok veriyi alır ve ondan güzel raporlar oluşturur. Her iki komut dosyasının her 5 dakikada bir çalışması gerekir. Yeni verilerden bir rapor oluşturabilmesi için komut dosyası 2'yi bir dakika kaydırmak istiyorum. EG Her bir saatte bir :00, :05, :10, :15 [...]komut dosyasını çalıştırmak ve iki komut dosyasını çalıştırmak istiyorum :01, :06, :11, :16 [...]. Komut dosyaları birbirine bağlı değildir ve komut dosyasının başarılı olup olmamasından bağımsız olarak komut 2'nin çalışması gerekir. Ancak raporların en son verilere sahip olması yararlı olabilir. Bu cron ile mümkün mü?

Mesaj;
Her iki komutu da bir kabuk betiğinde kullanmayı düşündüm, böylece hemen birbirlerinin peşinden koşarlar, ancak bu işe yaramaz, bazen komut dosyası 1 harici API'leri beklemeye asılabilir vb. Bu nedenle çalıştırılması 15 dakika sürebilir, ancak komut dosyası 2, her 5 dakikada bir çalışmalıdır, bu şekilde bunu yapmak, komut dosyası 2'nin çalışmasını durduracak / geciktirecektir, bunu Cron'da ayarlayabilseydim, komut dosyası 2'nin, komut dosyası 1'in ne yaptığından bağımsız olarak çalışacağı anlamına gelirdi.

Yanıtlar:


14

Ne zaman kullanmak istersen komut dosyalarını çalıştırabilirsin cron. Komut 1'i her 5 dakikada bir çalıştırmak isterseniz, şöyle başlayabilirsiniz:

*/5 * * * * /path/to/script1

Ancak bu gerçekten sadece kısaca:

0,5,10,15,20,25,30,35,40,45,50,55 * * * * /path/to/script1

Senaryo 2'yi senaryo 1'den bir dakika sonra çalıştırmak istiyorsan, bunu yapabilirsin:

1,6,11,16,21,26,31,36,41,46,51,56 * * * * /path/to/script2

Bunu da yapabilirsiniz:

*/5 * * * * /path/to/script1
*/5 * * * * /path/to/script2

Sonra betiğin başlangıcında bir dakika boyunca uyu:

sleep 60

4
Uykuyu komut dosyasının içine koymak, komut istemini el ile çalıştırmanın acı verici olmasını sağlayan çirkin bir kesektir. Crontab girişinin uyku kısmını yaparak bunu kesmek için daha çirkin bir yol var , ama daha da zarif bir yol, cevabınızın dokunmadığı doğru crontab notasyonunu kullanarak işleri dengelemektir.
Caleb

39

Crontab için tutanak giriş alanı, "kafa karıştırıcı" operatörün "artışlarını" kabul eder çünkü operatörün matematiksel bir "bölme" operatörü olması gerektiği gibi görünmektedir. En çok aşağıdaki gibi bir şey kullandığını göreceksiniz. Bunun, beşe bölünebilen sayıları bulamadığını, ancak her beşinci öğeyi kümeden aldığını unutmayın.

 */5 * * * * command

Bu, cron'a /50-59 ( *) kümesinden her beşinci öğeyi ( ) eşlemesini söyler ancak kümeyi şu şekilde değiştirebilirsiniz:

 1-59/5 * * * * command

Bu, komutunuzu 1-59, her beşinci öğede alır, komutunuzu 6, 11, 16, vb. Dakikalarda çalıştırır.

Bir dakikadan daha fazla ince taneli ofsetlere ihtiyacınız varsa, crontab'ınızın bir parçası olarak sleep komutunu kullanarak bunu kesebilirsiniz:

 */5 * * * * sleep 15 && command

Bu, işinizi her beş dakikada bir yürütür, ancak komut aslında dakikadan 15 saniye sonra başlamaz. Başka bir şeyden birkaç saniye geçtikten sonra fark yaratan kısa süren işler için tam bir dakika gecikmek istemezsiniz, bu basit bir kesmek.


1
Bu, kabul edilenden daha iyi bir cevap. Ofsetin menzille ayarlanması uykudan çok daha temizdir.
ND Geek

11

Zaman işaretini + simgesiyle belirtebilirsiniz. Örneğin, çalıştırmak için :01, :06, :11, :16 [...], gibi bir görev oluşturun

*/5+1 * * * * command

7
Bu bazı cron versiyonlarında işe yaramaz gibi görünmüyor
jhoff

1
Bu sözdizimini destekleyen hangi cron sürümünü kullanıyorsunuz? Cronie desteklemiyor gibi görünüyor.
Matthew G

CentOS7'de Cronie var, bu yüzden ilk önce bu çözümü denemeyeceğim.
AnneTheAgile

1

Bu benim için çalıştı:

1/5 * ? * * *

1 nerede ofset dakikadır. Yani üç dakikayı dengelemek istiyorsanız:

3/5 * ? * * *

Bunun AWS program ayarlarında çalışmasını sağladım.

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.