Üç günde bir Cron işi


96

Her üç günde bir cronjob çalıştırmak mümkün mü ? Ya da ayda 10 kez.


4
Evet mümkündür ve bu SuperUser'a aittir.

Anacron ile ay sınırlarına bakılmaksızın 3 günde bir çalıştırma yapılabilir.
ryanpattison

Yanıtlar:


131

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.


9
@whatshakin: "Her üç günde bir" ne kadar doğru olmasını istediğinize bağlı. Bu, 3'e bölünebilen herhangi bir günde çalışacaktır. Ay sınırlarında kesin olmayacaktır.
David

3
@whatshakin: Cronjob sözdizimi Wikipedia'da bile açıklanmıştır: en.wikipedia.org/wiki/Cronjob
Felix Kling

4
Bu, google'da çok yüksek bir sonuçtur ve bu nedenle, kabul edilen yanıt doğru olsaydı daha iyi olurdu, öyle değil. Tareco'nun açıklamasının doğru olduğuna inanıyorum.
lynks

14
Cevap doğru değil çünkü hiçbir öneri işi 3 günde bir çalıştırmıyor. 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
Modelin

8
Ben de bunun cevap olarak kabul edilmesinin talihsiz olduğunu düşünüyorum. Ay sınırları ne olursa olsun gerçekten her N günü arıyordum (bitkiler gibi şeyler, sularını ayın hangi günü aldıkları umurunda değil). En azından, tüm yorumları okuduktan sonra, cron timer'ın tek başına bu arzuyu tam olarak modellemediğine karar verdiğimi düşünüyorum.
Travis Griggs

70
* * */3 * *  that says, every minute of every hour on every three days. 

0 0 */3 * *  says at 00:00 (midnight) every three days.

açıklamayı takdir edin
pythonian29033

2
Bu genellikle üç günde bir
ateşlenir

25

Ben bir cron uzmanı değilim, peki ya:

0 */72 * * *

Kesintisiz olarak 72 saatte bir çalışacaktır.

https://crontab.guru/#0_ / 72_ _ _


3
Bu, kabul edilen çözümden daha doğrudur. Kabul edilen cevap, ayları değiştirirken başarısız olacak:then at 2019-02-28 00:00:00 then at 2019-03-01 00:00:00
Akira Yamamoto

Bunun ne zaman olacağı nasıl hesaplanır?
Bruce Edge

3
Crontab.guru'ya göre bu her gün çalışıyor. Kim haklı?
geliştirmem

1
Saat sütunundaki değer crontab.guru ve man crontab'a göre 0 ile 23 arasında olmalıdır .
harperville

1
* / 72, 0 ile aynıdır. Bu, her gece yarısı çalışır.
battey

19

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.


7
0 0 1-30/3 * *

Bu, 1. günden itibaren her üç günde bir yapılır. İşte 20 planlanmış çalıştırma -

  • 2015-06-01 00:00:00
  • 2015-06-04 00:00:00
  • 2015-06-07 00:00:00
  • 2015-06-10 00:00:00
  • 2015-06-13 00:00:00
  • 2015-06-16 00:00:00
  • 2015-06-19 00:00:00
  • 2015-06-22 00:00:00
  • 2015-06-25 00:00:00
  • 2015-06-28 00:00:00
  • 2015-07-01 00:00:00
  • 2015-07-04 00:00:00
  • 2015-07-07 00:00:00
  • 2015-07-10 00:00:00
  • 2015-07-13 00:00:00
  • 2015-07-16 00:00:00
  • 2015-07-19 00:00:00
  • 2015-07-22 00:00:00
  • 2015-07-25 00:00:00
  • 2015-07-28 00:00:00

5
2015-07-31 00:00:00, 2015-08-01 00:00:00 ... OOPS sadece 1 gün koşular arasında
Dziamid

5

İ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

3

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.


3

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

Örneğin pazartesi ve perşembe günleri çalışacak şekilde yapılandırırsanız daha basit olurdu, bu da ona 3 ve 4 günlük bir ara verir.

Aksi takdirde, günlük çalışacak şekilde yapılandırın, ancak php cron betiğinizin erken çıkmasını sağlayın:

if (! (date("z") % 3)) {
     exit;
}

0

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 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.


O zamandan beri, gelecek yıl olmayan bir artık yılda devir olur bu hıçkırık Değil ( 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.
kmoser
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.