İki haftada bir cron üzerinden komut dosyası çalıştırma


12

Bunun nasıl yapılacağı konusunda biraz araştırma yaptım ve görüyorum ki cron'da bir iş yürütmenin doğrudan bir yolu yok, mesela her Perşembe.

Şu anda, sadece her hafta çalışacak ve çalıştığında bir "bayrak" dosyasına dokunacak ve eğer çalışıyorsa ve dosya zaten oradaysa, dosyayı kaldırmak için (ve iki haftalık eylem).

Benim sorum şu, her iki haftada bir otomatik olarak yürütülen bir eylem senaryosunun bu hedefine ulaşmanın daha zarif veya daha basit bir yolu var mı?

Teşekkürler!


1
Bayrak dosyası yerine ISO hafta numaralarını kullanabilirsiniz. (Örn. Strftime% V.)

@Roger: Senaryodaki bir koşulda demek istediğini sanıyorum.
sonraki duyuruya kadar duraklatıldı.

@Dennis: Olmak zorunda değil (örneğin cevabımın komut dosyasının dışında nasıl kontrol edildiğine bakın), ancak asıl amacım çok daha basit olacağı ve dosya sisteminde herhangi bir durum gerektirmeyeceği. Ancak, ayın kontrol günü ile benzer bir dezavantajı olduğunu fark ettim: bazı yılların 53 haftası ve bazılarının 52'si var.

Yanıtlar:


11
0 0 * * Thu bash -c '(($(date +\%s) / 86400 \% 14))' && your-script

Ben tembellik yapmak için bash kullandım çünkü tembelim; bunu istediğiniz gibi değiştirin. 1 Ocak 1970 Perşembe olmaktan faydalanıyorum; haftanın diğer günleri için bir ofset uygulamanız gerekir. Cron'un kaçan yüzde işaretlerine ihtiyacı var.

Hızlı kontrol:

function check {
  when=$(date --date="$1 $(($RANDOM % 24)):$(($RANDOM % 60))" --utc)
  echo -n "$when: "
  (($(date +%s --date="$when") / 86400 % 14)) && echo run || echo skip
}

for start in "2010-12-02" "2011-12-01"; do
  for x in $(seq 0 12); do
    check "$start + $(($x * 7)) days"
  done
  echo
done

Not Perşembe günü herhangi bir zamanda çalıştırılırsa bunun gösterilmesi için rastgele zamanlar seçtim ve yıl sonu sınırlarının yanı sıra 4 ve 5 Perşembe günleri içeren ayları seçtim.

Çıktı:

Thu Dec  2 06:19:00 UTC 2010: run
Thu Dec  9 23:04:00 UTC 2010: skip
Thu Dec 16 05:37:00 UTC 2010: run
Thu Dec 23 12:49:00 UTC 2010: skip
Thu Dec 30 03:59:00 UTC 2010: run
Thu Jan  6 11:29:00 UTC 2011: skip
Thu Jan 13 13:23:00 UTC 2011: run
Thu Jan 20 20:33:00 UTC 2011: skip
Thu Jan 27 16:48:00 UTC 2011: run
Thu Feb  3 17:43:00 UTC 2011: skip
Thu Feb 10 05:49:00 UTC 2011: run
Thu Feb 17 08:46:00 UTC 2011: skip
Thu Feb 24 06:50:00 UTC 2011: run

Thu Dec  1 21:40:00 UTC 2011: run
Thu Dec  8 23:24:00 UTC 2011: skip
Thu Dec 15 22:27:00 UTC 2011: run
Thu Dec 22 02:47:00 UTC 2011: skip
Thu Dec 29 12:44:00 UTC 2011: run
Thu Jan  5 17:59:00 UTC 2012: skip
Thu Jan 12 18:31:00 UTC 2012: run
Thu Jan 19 04:51:00 UTC 2012: skip
Thu Jan 26 08:02:00 UTC 2012: run
Thu Feb  2 17:37:00 UTC 2012: skip
Thu Feb  9 14:08:00 UTC 2012: run
Thu Feb 16 18:50:00 UTC 2012: skip
Thu Feb 23 15:52:00 UTC 2012: run

2
Çağın doğasından beri saniyeler UTC'dir, cron localtime'da çalışır. Sistem saat diliminiz UTC değilse, karışıklığa neden olur. ("Neden çalışmıyor? Oh, zaten Cuma UTC'de"). Gün ışığından yararlanma zamanının varlığı, bu çalışmayı çok daha zorlaştırır (imkansız olmasa da, tarih size güncel UTC ofsetini gösterdiğinden)
derobert

5

atLinux çalıştırıyorsanız , yollardan biri yardımcı programı kullanmak olabilir . Bunu betiğinizin sonuna koyabilirsiniz:

at X + 2 weeks -f myscript

burada X , betiğinizi çalıştırmak istediğiniz zamandır. Başlatmak için sadece atilk kez çalıştırmak istediğiniz zamanı arayın ve sonra yukarıdaki ifade planlanan çağrınızı yenilemeye devam eder.


Bu uzun vadeli bir çözüm olacak ise ben de olsa çalıştırmayı tavsiye etmem ben komut dosyası çalıştırmak için gerekli olup olmadığını çalışacak bir işlev oluşturmak
Paul

3

anacronSistemde kullanabiliyorsanız , işler çok daha kolay olacaktır. Kullanmak anacroniçin kurulu olmalı ve ayrıca root erişimine sahip olmalısınız. Eski sistemlerde (örn. RHEL 5.x) çalışmaz, ANCron'un eski sürümleri SADECE önyükleme sırasında çalışır. Daha yeni sistemlerle (örn. RHEL 6.x) çalışır.

İle anacron, işler daha esnek bir şekilde programlanabilir, örneğin X işini haftada bir kez çalıştırın. Ayrıca anacronişler bilgisayar kullanıma sunulduğunda da çalışır, yani sistemin ne zaman yukarı veya aşağı olduğunu düşünmeniz gerekmez.

Bir komut dosyasını iki haftada bir çalıştırmak için, / etc / anacrontab dosyasına aşağıdakine benzer bir satır eklemeniz gerekir:

14 5 myScript script.sh

Ayrıntılar için kılavuz sayfasına bakınız.


Kullanmak anacronaçıkça en temiz çözüm IMO'dur (bazı insanlar için istenmeyen bazı sonuçları yoksa).
JanC

0

Her iki haftayı tanımlamanın daha zarif bir yolu olup olmadığından emin değilim, ama bu sizin için işe yarayabilir.

00 06 1-7,15-21 * * test `date +\%a` = Thu && /path/to/script

Bu, senaryoyu ayın ilk ve üçüncü Perşembe günü 06: 00'da başlatacaktır.


2
Yine de, 3 Perşembe günü bir ay varsa bu bir hafta atlamak rüzgar olur.
David Z

1
Sadece 3 Perşembe günü var mı? Her ne kadar 5 Perşembe varsa bir hafta atlamak görebiliyorum. Güncellenebilir 1-7,15-21,29-31, ancak son set için herhangi bir eşleşme olsaydı arka arkaya çalışır ...
pferate

1
3 Perşembe günü, sen 3 Perşembe toplam 3 Perşembe değil, komut dosyası çalışacak mı demek istediniz? İlk seferinde yanlış okumuş olabilirim.
Ağustos'ta pferate

0

Ben her hafta çalıştırmak ve senaryo hafta numarası tek bir sayı olup olmadığını görmek için kontrol var: eğer evet çıkmak.

Bunun, Aralık'tan Ocak'a kadar çalışması için biraz daha düşünülmesi gerekecekti.

Belki de komut dosyası bir "son başarılı çalışma" bayrak dosyası ayarlamış olabilir. Komut dosyası başlatıldığında, bayrak dosyasının en son 14 gün önce değiştirildiğini kontrol edin.

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.