Soru Cron damgalamadan nasıl korunur?


Her 15 dakikada bir çalışmam gereken birkaç tane cron betiğim var. Onları koşmaya hazırlayabilirim: */15 * * * * ama sonra hepsi aynı anda koşuyorlar. Sunucu birkaç dakika boşta beklemek için aptalca görünüyor ve aniden aynı anda bir düzine scriptleri yürütmeye çalışın.

1, 16, 31, 46 dakikalarında ve diğerinde 2, 17, 32, 47'de bir senaryoyu çalıştırmamın bir yolu var mı?

Diğer bir deyişle, her bir betiğin her 15 dakikada bir çalışmasını istiyorum, ancak özellikle çeyrek saatlerinde çalıştıkları umurumda değil.


12
2017-11-02 18:12


Menşei




Cevaplar:


Olması gerekenden daha da zorlaştırıyorsun. Hepsini aynı hatta, noktalı virgülle ayırın:

*/15 * * * * command1 ; command 2 ; command 3

Koşacak command1bitirmek için bekle, sonra koş command2bitirmek için bekleyin, vb.


7
2017-11-11 03:21





Eğer cron işini böyle yaparsan: 6-59/15 * * * * Daha sonra saat 6, 21, 36 ve 51 dakika geçecek.

Bu, tüm cron sürümleriyle çalışmayabilir.


15
2017-11-02 18:17





Tüm komut dosyalarını bir dizine koyabilirsiniz /etc/cron.15mve sonra cron çalıştır

*/15 * * * * run-parts /etc/cron.15m

Varsayalım ki run-parts Komut. En azından tüm Debian tabanlı sistemlerde mevcut. Adlandırılmış dizindeki tüm yürütülebilir programları, liste sırasına göre bir seferde çalıştırır.

Bu yöntemin bir dezavantajı, komut dosyalarından birinin askıda kalması durumunda, tüm geri kalanların bekleyeceği ve çalıştırılamayacağıdır. Eğer hepsinin çalışma süresi 15 dakikadan fazla ise, o zaman iş tekrar çalışmaya başlayacak ve çok fazla süreç biriktirebileceksin.


14
2017-11-02 18:59



run-parts Fedora / Red Hat sistemlerinde de bulunmaktadır. - mattdm


Bunu yapmanın en basit yolu, komutları istediğiniz zaman çalıştırmak için el ile ayarlamaktır:

0,15,30,45 * * * * command0
1,16,31,46 * * * * command1
2,17,32,47 * * * * command2
...
14,29,44,59 * * * * command14

Veya otomatik olarak uygun crontab girişlerini (yazım hatalarını önleyen) oluşturmak için bir komut dosyası yazabilirsiniz.

Bazı cron sürümleri (muhtemelen kullanmakta olduğunuzı içerir) genişletilmiş bir sözdizimini kabul eder:

0-59/15 * * * * command0
1-59/15 * * * * command1
1-59/15 * * * * command2
...
14-59/15 * * * * command14

9
2017-11-02 19:46





Cron, yapmaya çalıştığın şeyde gerçekten iyi değil. Temelde 15 dakika uyuyan, komutu uygulayan ve sonra döngüler yapan bir senaryo olarak çalışan bir senaryo yazmayı düşündünüz mü?


0
2017-11-02 19:03



Bununla ilgili birkaç sorun var. Birincisi eğer sleep 300 Komutun her bir yürütme işlemi arasında, komutun kendi yürütülmesi zamanın kaymasına neden olacaktır; Her 15: 10'dan sonra her 15: 10'da bir koşabilir. Ve eğer arka plan işlemi ölürse ya da sistem yeniden başlarsa crondotomatik olarak yeniden başlatılmaz. Bir arka plan sürecini "arka planlaştırmak" için yollar vardır, ancak daha sonra yeniden uygularsınız. crond. - Keith Thompson
Evet, mükemmel bir çözüm olmadığına katılıyorum (ancak her zaman görevle birlikte arka planda çalışabiliyor olsanız da), ama işte gidiyorsunuz. - Matt Simmons
Bunun yerine, cron'u sırayla tüm komutlarınızı yürüten tek bir betik çalıştırmanız yeterlidir. Aslında, böyle bir standart kod denilen böyle bir ihtiyaç run-parts Bu, özellikle bunu yapmak için çoğu cron yüklemesiyle birlikte gelir. @ AndrewSchulman'ın cevabı. - tylerl


Birçok dağıtımda /etc/cron.d/cronhourly var, içindeki tüm betikler saatlik olarak çalışır. Hatta sırayla numaraları ile başlayarak siparişi bile belirtebilirsiniz, 01scriptA 02scriptB gibi - biz zaten bir "cronhourlybyfour" üretmek zorunda olduğun cron bilgisi ile Pürüzsüz duvarın linux distro üssü olarak adlandırdığımız gibi önemsiz olmalı :)

Uyarı Sözü: Bu, önceden önerildiği gibi run-parçaları kullanır ve run-parçaları, a ile betikleri sevmez. adında, bu yüzden "deletehomefolders.sh" demeyin, "01deletehomefolders" olarak adlandırın ve sağ # ile başladığınızdan emin olun! senaryonuzu yorumlamayı ne amaçla istersen


0
2017-11-10 21:56