Her üç günde bir cronjob çalıştırmak mümkün mü ? Ya da ayda 10 kez.
Her üç günde bir cronjob çalıştırmak mümkün mü ? Ya da ayda 10 kez.
Yanıtlar:
Her üç günde bir çalıştırın ...
0 0 */3 * *
Peki ya bu?
1., 4., 7., vb. Gibi ayın belirli günlerinde çalışmasını istiyorsanız, o zaman komut dosyanızda ayın geçerli gününü kontrol eden bir koşul olabilir.
if (((date('j') - 1) % 3))
exit();
veya @mario'nun işaret ettiği gibi, ayın gününe göre yapmak yerine yılın gününü almak için tarih ('k') kullanabilirsiniz.
0 0 */3 * *1'inci, 4'üncü, 7'nci vb. günlerde çalışır */3anlamına 1-31/3gelir ( anlamına gelir 1,4,7...31), böylece boşluk ay sonunda daha küçük olur. (Önceki ayda 31 gün varsa, arka arkaya 2 gün çalışacaktır.) date('j') % 3
* * */3 * * that says, every minute of every hour on every three days.
0 0 */3 * * says at 00:00 (midnight) every three days.
Ben bir cron uzmanı değilim, peki ya:
0 */72 * * *
Kesintisiz olarak 72 saatte bir çalışacaktır.
then at 2019-02-28 00:00:00 then at 2019-03-01 00:00:00
Cron "vatansız" olduğundan, "frekansları" doğru bir şekilde ifade edemez, yalnızca (görünüşte) sürekli olarak mevcut zamanla eşleştiği "kalıpları" ifade eder.
Sorunuzu yeniden ifade etmek, bunu daha açık hale getirir: "2 gece içinde çalıştığı geceleri atlamak dışında her gece 00: 01'de bir cronjob çalıştırmak mümkün müdür?" Cron o anki zamanı iş talebi zaman kalıplarıyla karşılaştırırken, cron'un işinizi geçmişte çalıştırıp çalıştırmadığını bilmesinin bir yolu yoktur.
Genellikle bu yinelenen olayı sonlandırmanız ve tamamen yenisini yeniden başlatmanız gerekir; bu, karmaşık takvim uygulamalarının bile yinelenen kalıpları nasıl temsil ettiğinin sınırlı ifadesini göstermektedir. Ve tabii ki Takvimlerin birçok durumu vardır - her bir olay bağımsız olarak silinebilir veya yeniden planlanabilir [çoğu takvim uygulamasında]).
Dahası, muhtemelen her 3 gece için iş yapmak istiyorum başarılı olursa , ancak sonuncusu başarısız olursa, hatta daha erken bir saat sonra (ama durdurma yeniden deneniyor gibi (3 gün daha beklemek), hemen tekrar belki sonraki gece denemek veya sabah varışta). Açıkçası, cron işinizin başarılı olup olmadığını muhtemelen bilemez ve bu kalıp, alternatif bir daha sık "yeniden deneme" programını da ifade edemez.
HER ZAMAN - Kendin istediğini yapabilirsin. Bir komut dosyası yazın, cron'a her gece 00: 01'de çalıştırmasını söyleyin. Bu komut dosyası, "son çalıştırmayı" kaydeden bir şeyin * zaman damgasını kontrol edebilir ve> 3 gün önce ** ise, işi gerçekleştirip "son çalıştırma" zaman damgasını sıfırlayabilir.
(* bu zaman damgalı gösterge, işleyebileceğiniz ve inceleyebileceğiniz, ancak cron'un yapamayacağı bir miktar kalıcı durumdur)
** İnsan tarafından okunabilen saat zamanını kullanıyorsanız, zaman aritmetiğine dikkat edin - yılda iki kez, bazı günler günde 23 veya 25 saat sürüyor ve 02: 00-02: 59 bir günde iki kez oluyor veya herşey. Bunu önlemek için UTC kullanın.
0 0 1-30/3 * *
Bu, 1. günden itibaren her üç günde bir yapılır. İşte 20 planlanmış çalıştırma -
İhtiyacın olana sahip olduğunu sanmıyorum:
0 0 */3 * * ## <<< WARNING!!! CAUSES UNEVEN INTERVALS AT END OF MONTH!!
Ne yazık ki, * / 3 aralığını ayarlıyor her n ayın gün ve değil n günde . Bakınız: burada açıklama . Ayın sonunda, garantili tekrar eden sorun var.
1st at 2019-02-01 00:00:00
then at 2019-02-04 00:00:00 << 3 days, etc. OK
then at 2019-02-07 00:00:00
...
then at 2019-02-25 00:00:00
then at 2019-01-28 00:00:00
then at 2019-03-01 00:00:00 << 1 day WRONG
then at 2019-03-04 00:00:00
...
Bu makaleye göre , "her N günde bir" TRUE elde etmek için çalıştırılan komuta biraz modulo matematik eklemeniz gerekir. Örneğin:
0 0 * * * bash -c '(( $(date +\%s) / 86400 \% 3 == 0 )) && runmyjob.sh
Bu örnekte, iş her gün 12: 00'da kontrol edilecek, ancak yalnızca 01-01-1970 modulo 3'ten sonraki gün sayısı 0 olduğunda yürütülecektir.
Belirli bir tarihten itibaren her 3 günde bir olmasını istiyorsanız, aşağıdaki biçimi kullanın:
0 0 * * * bash -c '(( $(date +\%s -d "2019-01-01") / 86400 \% 3 == 0 )) && runmyjob.sh
Peki ya:
00 00 * * * every 3 days && echo test
everySenaryo nerede :
#!/bin/sh
case $2 in
days)
expr `date +%j` % $1 = 0 > /dev/null
;;
weeks)
expr `date +%V` % $1 = 0 > /dev/null
;;
months)
expr `date +%m` % $1 = 0 > /dev/null
;;
esac
Yani her gün çalışır.
Kullanılması */3ayın 30, 3., 6., ... 27 ishal, ama bir ay, bir 31 gün var sonra sonra yanlış. everySenaryo yılın sonundan itibaren sadece yanlıştır.
Temellerini öğrenmelisiniz crontab.
Cron'u komutla düzenleyin crontab -eve ardından ⌃ (CTRL)+ Xardından Yve son ENTER (return)olarak dosyayı kaydetmek için mac'a basın . Yeni cronların kurulu olup olmadığını kontrol edebilirsiniz.crontab -l
Bir crontab dosyasında dakika, saat, ayın gününü, ayı ve haftanın gününü belirtmek için beş alan ve ardından bu aralıkta çalıştırılacak komut bulunur.
* * * * * command to be executed
- - - - -
| | | | |
| | | | +----- day of week (0-6) (Sunday=0)
| | | +------- month (1-12)
| | +--------- day of month (1-31)
| +----------- hour (0-23)
+------------- min (0-59)
* yukarıdaki değer alanında, o sütun için parantez içinde olduğu gibi tüm yasal değerler anlamına gelir.
Burada bununla ilgili ayrıntılı bir yazı yazdım: Unix'te Cron Kurun
1., 4., 7., vb. Gibi ayın belirli günlerinde çalışmasını istiyorsanız, o zaman komut dosyanızda ayın geçerli gününü kontrol eden bir koşul olabilir.
Bunun için ihtiyacınız olan her şeyin * / 3 yerine olduğunu düşündüm, yani her üç günde bir, 1 / 3'ü kullanın, yani her ayın 1'inden başlayarak her üç günde bir. yani 7/3, ayın 7'sinden itibaren her üç günde bir anlamına gelir, vb.
0 0 * * * [ $(($((tarih +% - j- 1)) % 3)) == 0 ] && script
date0'dan başlamak için yılın gününü 1'e kaydırın, modulo üç olup olmadığını kontrol edin.
( 365-1 ) % 3 == 1ama ( 1 - 1 ) % 3 == 0? Daha iyi hesaplamanın Unix Epoch'tan bu yana geçen günlerin sayısına bağlı olacağını düşünüyorum.