Soru 31, bir cron işinde ayın sonu anlamına geliyor mu?


Cron işi için, zamanı aşağıda belirleyebileceğ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, 31. ayın gününü belirlediğimizde, ayın 31'inci ay olmamasına rağmen, her ayın sonu anlamına geliyor. Cevap almayı umuyoruz.

Şimdiden teşekkürler


12
2017-08-18 10:08


Menşei




Cevaplar:


Hayır, 31 31 anlamına geliyor.

Ancak, bazı hile yapabilirsiniz. İşi, ayın son günü olabilecek (örneğin, ayın son günü 28-31) olabilecek herhangi bir günde çalışacak şekilde ayarlayın ve ardından komutunuzu, korumanın bulunduğu tarihte bir sınama içeren bir kabuk ifadesi ile değiştirin. komut:

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

Test parantez içindeki ifade, bugünün ay sayısının yarının ay numarasına göre farklı olup olmadığını soruyor, ki bu elbette ayın son günü geçerli olacak. Bu ifadenin formunun yerel bölgenize bağlı olduğunu unutmayın. date - Mevcut GNU sürümüne sahip değilseniz, onu düzeltmeniz gerekebilir.

Bunu icat etmediğimi söylemeliyim - bir Matthew Jarvis tarafından bir posta listemizde hızlı bir google (orijinal posterin kendisi, kötü poster!) İle buldum. Yine de bunun standart bir eski unix sihirbazının hilesi olduğunu düşünürdüm.


21
2017-08-18 12:18



GNU'ya özgü seçenekleri "tarih" =) verilen bir numaradan çok eski olamaz. - jj33
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ü Google'da bunu araştıran bir sonraki kişi, stackexchange üzerindeki cevabı bulacaktır ve buraya gelecektir. - miernik


Hayır, bence yapabileceğiniz en iyi şey ayın 1'inde gece yarısı koşmak ya da her ay için bireysel crontab hatları kurmak (ya da en azından 28,29,30 ve 31 gün ile aylar için bir çizgi)

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

10
2017-08-18 10:12



Teşekkürler Paul! İkincisini takip edeceğim. İkinci yöntem için aynı dosyayı üç kez doğru olarak ayarlamalı mıyım? Tekrar teşekkürler :)
Evet, tekrarlamanız gerekecek. - Paul Dixon
Cron'la hiç deneyimim yok, ancak "0 0 28,29 2" bir sıçrama yılında iki kez mi yürütmez? Bu önümüzdeki iki yıl için bir sorun değil, ama yine de ... - Wim ten Brink
İyi bir nokta, bunun için kolay bir yol yok - Paul Dixon


Bunu kolayca yapabileceğinizi düşünmüyorum crontab.

Bir seçenek belirlenecek cron komut dosyasını her gün çalıştırıp ayın son günü olup olmadığını kontrol et.


4
2017-08-18 10:32





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

*    *    L    *    *    your_script.sh 

senaryosunu her ayın son gününde yürütür

Diğer yandan,

*    *    0    *    *    your_script.sh

Hatta şöyle bir şey belirtebilirsiniz:

*    *    *    *    1,5L    your_scrript.sh

her ayın son pazartesi ve cuma günü senaryoyu çalıştırmak için

veya

*    *    *    *    1    your_script.sh

senaryoyu gece yarısı her pazartesi günü yürütmek için.


3
2018-05-21 12:58





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

0
2017-08-21 19:54