İki haftada bir cronjob nasıl planlanır?


11

crontab (5) aşağıdaki alanları tanımlar:

       field         allowed values
       -----         --------------
       minute        0-59
       hour          0-23
       day of month  1-31
       month         1-12 (or names, see below)
       day of week   0-7 (0 or 7 is Sun, or use names)

ve açıklar:

 Step values can be used in conjunction with ranges.  Following a range
 with ``/<number>'' specifies skips of the number's value through the
 range.  For example, ``0-23/2'' can be used in the hours field to specify
 command execution every other hour (the alternative in the V7 standard is
 ``0,2,4,6,8,10,12,14,16,18,20,22'').

Yani, iki haftada bir İş yok, benim anlayışım kadarıyla. Geçici çözümler olduğundan eminim, sizinkiler neler? Yoksa bir şey mi kaçırdım?


2
Bu konuda bulabileceğim en iyi cevap burada: unix.stackexchange.com/questions/1224/…
Somantra

... ve U&L ile ilgili bu cevaplar bunu yapmamın yolu, @Somantra :-)
voretaq7

@ voretaq7, ben kanonik cevap olduğunu söyleyebilirdim, ama bilgiçlikle karşılaşmak istemedim ;-)
Somantra

Yanıtlar:


8

Her çarşamba günü cron tarafından çalıştırılan şeyi, daha sonra bir hafta veya tek bir hafta olup olmadığına karar vermesini sağlayabilirsiniz. Örneğin:

#!/bin/bash
week=$(date +%U)
if [ $(($week % 2)) == 0 ]; then 
    echo even week
else 
    echo odd week
fi

Bu güzel bir çözüm, ancak soruyu gerçekten cevaplamıyor - şeyi program mantığıyla lekelememeyi tercih ederim. Belki bunu @Somantra'nın verdiği bağlantıyla entegre edebilirim.
Roman

Tamam, itiraf etmeliyim: bu şimdiye kadarki en iyi çözüm. @Somantra'nın verdiği bağlantı, gereksiz şekilde karmaşık IMHO'yu (UNIX zamanı ile sayılır) elde eder, ancak yaklaşımınızı aynı stilde doğrudan cronjob'a (senaryo yerine) eklemek oldukça zarif hale getirir.
Roman

Bu, 2020 yılında kırılıyor çünkü 53 haftası var. Örn: Cron'unuz 31 Aralık'ta haftada iki kez çalışacak şekilde planlanmışsa, 31 Aralık 2020 (53. hafta) ve 4 Ocak 2020 (1. hafta) 'da çalışır.
mad_fox

5

Birçok crons (hangisini kullandığınızı belirtmediniz) destek aralıkları. Yani böyle bir şey

0 0 1-7,15-21 * 3

Ayın birinci ve üçüncü çarşamba günlerini vuracaktı.


Bu, "kod içinde yap" yönteminden biraz daha zariftir, ancak crontab'ınıza bir yorum eklemeyi unutmayın (genel kural: birden fazla -veya /
dahilseniz

Bunun yanlış olduğundan şüpheleniyorum; işin her ayın ve her Çarşamba gününün 1, 7 ve 15-21'inde yapılmasına neden olur . Gelen bu man 5 crontab: " Bir komutun çalıştırılacağı gün iki alandan olabilir - ayın günü ve haftanın günü her iki alanlar kısıtlanıyorsa zaman (yani, değil * edilir), komut çalıştırılır. Her iki alan eşleşir Örneğin, "30 4 1,15 * 5", bir komutun her ayın 1'inde ve 15'inde, her Cuma ve saat 6: 30'da, artı her Cuma çalıştırılmasına neden olur (benim vurgu).
MadHatter

1
Aslında, bu hangi cron cini kullandığınıza bağlıdır. Girişiniz vixie cron'dan (RedHat dağıtımlarına dahil) görünüyor. Dillo'nun cronundaki "man crontab" dan (Slackware): Hem ay hem de haftanın bir gününü belirtirseniz, * ayın N'inci günü olarak yorumlanır *. Yine de, komut dosyası içeren bir çözüm (hafta sayısını hesaplayan) tek taşınabilir çözüm gibi görünüyor.
AlvaroGMJ

2

Her hafta çalıştırılması gereken bir şey için bu tek astarı kullanın:

0 0 * * 5 [ `expr \`date +\%V\` \% 2` -eq 0 ] && echo "execute script" 

Bu komut dosyasının Cuma günleri çalışması planlanmaktadır. Yürütülecek hafta "-eq 0" veya "-eq 1" kullanılarak ayarlanabilir


1

Anacron , cron sınırlamaları için iyi bir çözümdür.

  • Anacron'un 14 olarak ayarlayabileceğiniz bir Tekrarlama Dönemi parametresi vardır.

dönem gecikmeli iş tanımlayıcı komutu

14 15 test.daily /path/to/script.sh


Ne yazık ki, anakron kullanılamaz. Bundan bahsetmeyi unuttum.
Roman

1

İhtiyaçlarınız tam anlamıyla iki haftada bir değilse, cronjob'ı ayın 1 ve 15'inde çalıştırabilirsiniz:

15 8 1,15 * * /your/script.sh

Bu, haftanın gününden bağımsız olarak her ayın ilk ve on beşinci günü sabah 8: 15'te çalışır.


-2

Bu açıklama ayarı hafta alan 3/2 her Çarşamba günü görevi çalıştırmak gerekir - örtülü, ama bence yapılabilir.


hayır, bu for(int i=3; i <=3 ; i+=2) {} sadece bir kez geçtiği için eşdeğerdir , "adım" 1 veya 2 ise önemli değil.
güveç

@ Stew dedi. Ayrıca, "hafta alanı" yoktur.
Roman

Hafta alanına göre, "Haftanın günü alanı" demek istiyorum
Journeyman Geek
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.