31 mutlaka bir cron işinde ay sonu anlamına mı geliyor?


13

Cron işi için zamanı aşağıdaki gibi ayarlayabileceğimizi biliyoruz.

# +------------ Minute (0 - 59)
# | +---------- Hour (0 - 23)
# | | +-------- Day of the Month (1 - 31)
# | | | +------ Month (1 - 12)
# | | | | +---- Day of the Week (0 - 7) (Sunday is 0 or 7)
# | | | | |
# * * * * * command

Bilmek istediğim şu ki, 31. ayın gününü ayarladığımızda, bu ayın 31. günü olmasa da her ayın sonu anlamına mı geliyor. Cevap almayı umuyorum.

Şimdiden teşekkürler

Yanıtlar:


22

Hayır, 31, 31 anlamına gelir.

Ancak, biraz hile yapabilirsiniz. İşi, potansiyel olarak ayın son günü olabilecek herhangi bir günde çalışacak şekilde ayarlayın (örneğin, ayın günü alanında 28-31) ve ardından komutunuzu, tarihi koruyan tarihte bir test içeren bir kabuk ifadesiyle değiştirin komut:

0 0 28-31 * * [ "`date +%m`" != "`date --date=tomorrow +%m`" ] && command

Test köşeli ayraçlarının içindeki ifade, bugünün ay sayısının yarın ay sayısından farklı olup olmadığını sorar; bu, elbette yalnızca ayın son gününde geçerli olacaktır. Bu ifadenin biçiminin yerel ayarınıza bağlı olduğunu unutmayın date- geçerli GNU sürümünüz yoksa bu ayarı değiştirmeniz gerekebilir.

Bunu icat etmediğimi söylemeliyim - Matthew Jarvis'in bir posta listesi postasında hızlı bir Google ile buldum. Yine de bunun standart bir eski Unix sihirbazının hilesi olduğunu düşünürdüm.


1
GNU'ya

4
Stackexchange sitelerinde, bir Google aramasıyla yanıtlanabilecek bir soru sormak kötü bir şey DEĞİLDİR. Aslında bu iyi bir şey, çünkü bunu Google'da arayacak bir sonraki kişi stackexchange'teki cevabı bulacağından buraya gelecek.
miernik

12

Hayır, bence yapabileceğiniz en iyi şey ayın 1'inde gece yarısında veya her ay için ayrı ayrı crontab satırları oluşturmaktır (veya en azından 28,29,30 ve 31 günlük aylar için bir satır)

0 0 28,29 2               * /my/command
0 0 30    4,6,9,11        * /my/command
0 0 31    1,3,5,7,8,10,12 * /my/command

Teşekkürler Paul! İkincisini takip edeceğim. İkinci yöntem için aynı dosyayı üç kez ayarlamam gerekir mi? Tekrar teşekkürler :)

Evet, tekrarlamanız gerekecek.
Paul Dixon

7
Cron ile ilgili hiçbir deneyimim yok, ancak artık yılda iki kez "0 0 28,29 2" yürütmüyor musunuz? Bu önümüzdeki iki yıl için bir sorun olacağını değil, ama yine de ...
Wim ten Brink

Bu iyi bir nokta, kolay bir yol yok
Paul Dixon

4

Bunu kolayca yapabileceğinizi sanmıyorum crontab.

Bir seçenek cron, komut dosyasını her gün çalıştırmak ve daha sonra komut dosyasının ayın son günü olup olmadığını kontrol etmesini sağlamak olacaktır.


3

Sanırım cron bu amaç için özel bir karakter 'L' var:

*    *    L    *    *    your_script.sh 

betiğinizi her ayın son günü yürütür

Diğer yandan,

*    *    0    *    *    your_script.sh

Hatta şöyle bir şey de belirtebilirsiniz:

*    *    *    *    1,5L    your_scrript.sh

senaryoyu her ayın son Pazartesi ve Cuma günleri yayınlamak için

veya

*    *    *    *    1    your_script.sh

senaryoyu her Pazartesi gece yarısı çalıştırmak için.


0

Bu işi yapacak:

if [ $( date +%-d --date="tomorrow" ) -eq 1 ]
then echo Last day of the current month
else echo Not yet!
     exit 0
fi

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