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