Her ayın ilk Pazartesi günü bir cron işi mi yapıyorsun?


32

Her ayın ilk pazartesi günü saat 8.30’da cron’dan çalışmak istiyorum. Cron Vikipedi sayfasında diyor

Normalde iş, saat / tarih özelliği alanları geçerli saat ve tarihle eşleştiğinde yürütülürken, bir istisna vardır: eğer hem "ayın günü" hem de "haftanın günü" kısıtlanmışsa ("*" değil), ya "ayın günü" alanı (3) veya "haftanın günü" alanı (5) geçerli günle eşleşmelidir.

(vurgum)

Bu, ayın ilk Pazartesi günü yapamayacağım anlamına gelir, ayın yalnızca ilk (veya her neyse) gününü yapabilirim? Etrafında bir yol düşünemiyorum.


slhck - kulağa iyi bir çözüm gibi geliyor - tam kodla cevap olarak genişletir misiniz? sonra doğru olarak işaretleyeceğim :)
Max Williams

Yanıtlar:


39

Koşulu gerçek crontab komutuna koyabilirsiniz:

[ "$(date '+%a')" = "Mon" ] && echo "It's Monday"

Şimdi, bu durum bir ayın ilk yedi gününden birinde doğruysa, ilk Pazartesi gününe sahipsiniz. Crontab'da, yüzde sözdiziminin kaçması gerektiğini unutmayın

0   12  1-7 *   *   [ "$(date '+\%a')" = "Mon" ] && echo "It's Monday"

echoKomutu çalıştırmak istediğiniz gerçek komutla değiştirin . Ben de benzer bir yaklaşım buldum .


Aslında, slhck, çok erken konuştum - bu benim crontab'ımda çalışmıyor: tarih testinde bir sebepten dolayı bir problem var gibi görünüyor. Bu komut satırında [ "$(date '+%a')" = "Mon" ] && echo "It's Monday"olduğu gibi çalışır [ $(date '+%a') = "Mon" ] && echo "It's Monday" Ama, crontab içinde bu testte başarısız görünüyor. Cron'dan da herhangi bir faydalı geri bildirim alamıyorum: Bunu [ "$(date '+%a')" = "Tue" ] >> /home/deploy/cron.log 2>&1herhangi bir hata çıktısını bir günlüğe kaydetmeye çalışıyorum ama bu da çalışmıyor: /
Max Williams

Hm. dateÇıktının doğru olup olmadığını kontrol edebilir misiniz ? Örneğin, cronbunu bir dosyaya veren bir komutun çalışmasına izin verin : date '+%a' > ~/datetest 2>&1- sonra bunun karşılaştırmak için doğru dizgeyle sonuçlanıp sonuçlanmadığını kontrol edin.
slhck

1
Ben sorun buldum - in yüzde +%aonu crontab iken kaçan gerekli, yani bu olması gereken hat: [ "$(date '+\%a')" = "Mon" ] && echo "It's Monday". Bununla cevabınızı güncelleyebilseydiniz, gelecekteki okuyucular için yararlı olurdu :) Tekrar teşekkürler - max
Max Williams

Oh, şimdi nedenini anladım. Şimdi çalıştığına sevindim, denediğin için teşekkürler!
slhck

15

İspanyolcada yerel ayarlara sahip bir bilgisayarım var, bu nedenle bu yaklaşım benim için çalışmıyor çünkü mon lun değişiyor

Diğer diller de başarısız olur, bu yüzden, dil engelini ortadan kaldıran kabul edilen cevap üzerinde küçük bir değişiklik yaptım:

 0 9 1-7 * *   [ "$(date '+\%u')" = "1" ] && echo "¡Es lunes!"

+1 ¡Muy bien, señor!
JakeGould

1
Gracias ¡Pura vida! ; D
cumanacr

Bu kabul edilen cevap olmalı. Hafta içi farklı isimler kullanan Hollandalı bir yerel ayar var. Ayrıca sayıları kullanmak, haftanın gününü belirlemek için dizeleri karşılaştırmaktan daha temiz hissediyor.
0ne_Up

7

Gün numaralarını işlemeye gerek olmadığında daha kolay buluyorum.

Her ayın ilk pazartesi günü çalıştırın:

0 2 * * 1 [ `date '+\%m'` == `date '+\%m' -d "1 week ago"` ] || /path/to/command

Örneğin, 1 hafta önceki ay geçerli ayla aynı değilse, ayın 1'inci gününde (= Pazartesi).

Benzer şekilde, Üçüncü Cuma için

0 2 * * 6 [ `date '+\%m'` == `date '+\%m' -d "3 weeks ago"` ] || /path/to/command

Örneğin, 3 hafta önceki ayın mevcut aydan farklı olması durumunda, ayın 3. gününde 6 (= Cuma)


Haftanın 6. günü cumartesi, cuma değil.
Robert

4

Her ayın 4. pazartesi günü saat 4.00’de aşağıdaki gibi çalışmasını planladım:

0 16 22-28 * Mon [ "$(date '+\%a')" == "Mon" ] && touch /home/me/FourthMonOfMonth.txt

1

Bildiğim kadarıyla sadece crontab kullanarak mümkün DEĞİLDİR, ancak bir "sarmalayıcı işlev" ayın ilk yedi günü "contab girişinden"; bkz bu girişten.

Sarmalayıcı komut dosyası

#! /usr/bin/ksh
day=$(date +%d)
if ((day <= 7)) ; then
   exec somecommand
fi
exit 1

crontab girişini kullanarak çalıştırmanız gerekir (varsayarak wrapper.sh ve global olarak erişilebilir).

0 0 * * 1 wrapper.sh

teşekkürler elemaki. Çalıştırılan görevin içinde bazı ekstra kodlar kullanarak, senaryodaki ayın ilk pazartesi olup olmadığını test etmek ve ardından her pazartesi crontab'da arayarak benzer bir çözüm düşündüm. Bu yakut bir senaryo yani haftanın gününü test etmek kolay. Ama bir crontab tek yolu olacağını umuyordum.
Max Williams

1

Solaris 10'da durumu aşağıdaki gibi biçimlendirmek zorunda kaldım:

[ `date +\%a` = "Sat" ] && echo "It's Saturday"

1

Ayın ilk yedi günü için cronjob çalıştırmayı deneyebilir ve sadece Pazartesi günü çalışmasına izin verebilirsiniz.

30 8 * * 1 [`date +\%d` -le 07] && <job>

Yukarıda senin için çalışmalı.


+1 puan daha yükseldi, ardından ilk hafta koşup Pazartesi günü kontrol edildi. :-)
xmedeko

1

Kullanmanızı öneririm

"$(/bin/date '+%\w')" = "1"

yerine

"$(date '+\%a')" = "Mon"

yerel sorunlardan kaçınmak için.


0

Bu tür sorunlara genel bir çözüm yaptım, ayın son haftası birinci, ikinci, üçüncü ..... için çalışıyor.

Bu şekilde kullanabilirsiniz:

30 06 * * Mon run-if-today 1 "Mon" && echo "First Monday"
30 06 * * Thu run-if-today 3 "Thu" && echo "Third Thursday"
30 06 * * Sun run-if-today L "Sun" && echo "Last Sunday"

Komut çalıştırılmış komut dosyası hem hafta içi hem de istenen hafta tarih aralığını kontrol eder, her ikisi de eşleşirse 0, aksi takdirde 1 değerini döndürür.

Kodu buradan kontrol et. https://github.com/xr09/cron-last-sunday


0

Bunun sorunu daha zarif bir şekilde çözdüğünü düşünüyorum:

30 8 1-7 * 1 /run/your/job.sh

1
Doh! : "Her iki alan da kısıtlanırsa (yani * değilse), her iki alan da geçerli saatle eşleştiğinde komut çalıştırılır."
symcbean

Ayrıca Şubat'ta (28'inde biten) her 4 yılda bir çalıştırılmayacak.
igraczech

"Her ikisi", "her ikisi" değil, herhangi biri anlamına gelir. bu, ayın 1 günü için her gün çalışacaktır.
eksi

Bu satır, her ayın ilk yedincisine, ayrıca her pazartesiye bir emir verir
Tomasz Jakub Rup

0

Cron ifadelerimi php ve js kullanarak yorumladığım için bash kullanamıyorum. Sonunda o bulmuştur olan aslında sadece cron ile mümkün:

0 30 8 * 1/1 MON#1

Umarım bu başka birine yardımcı olur. Ne olursa olsun, hepinize güzel bir gün diliyorum. :-)


Bu cron değil, muhtemelen kuvars
sivann

-1
0 9 1-7 * 1 * 

Bu, her ayın her pazartesi günü çalışacak.


Bir cevap vb daha yeni bir sürümü üzerinde, cevabın daha iyidir, farklı veya yararlı kabul edilmiştir
mic84
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.