31 implica necessariamente la fine del mese in un lavoro cron?


13

Per cron job sappiamo di poter impostare l'ora come di seguito.

# +------------ 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

Quello che voglio sapere è che quando impostiamo il giorno del mese 31, ciò significa la fine di ogni mese anche se il mese non ha il giorno 31. Spero di ottenere una risposta.

Grazie in anticipo

Risposte:


22

No, 31 significa 31.

Tuttavia, puoi fare qualche trucco. Impostare il lavoro in modo che venga eseguito in qualsiasi giorno che potrebbe essere l'ultimo giorno del mese (ovvero 28-31 nel campo del giorno del mese), quindi sostituire il comando con un'espressione della shell comprendente un test alla data di protezione del comando:

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

L'espressione all'interno delle parentesi del test chiede solo se il numero del mese di oggi è diverso dal numero del mese di domani, il che ovviamente sarà vero solo l'ultimo giorno del mese. Nota che la forma di questa espressione dipende dal tuo locale date- potrebbe essere necessario modificarla se non hai la versione GNU corrente.

Devo dire che non l'ho inventato, l'ho trovato con un veloce Google in un post di una mailing list di Matthew Jarvis. Immagino che questo sia davvero un vecchio trucco da mago Unix standard, però.


1
Non può essere troppo vecchio di un trucco date le opzioni specifiche di GNU su "date" =)
jj33

4
Sui siti stackexchange, porre una domanda a cui è possibile rispondere con una ricerca su Google, NON è una cosa negativa. In effetti è una buona cosa, poiché la prossima persona che cercherà questo su Google troverà la risposta su stackexchange e verrà qui.
miernik,

12

No, penso che il meglio che puoi fare sia correre a mezzanotte del 1 ° mese o impostare singole linee crontab per ogni mese (o almeno, una linea per mesi con 28,29,30 e 31 giorni)

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

Grazie Paolo! Seguirò il secondo. Per il secondo metodo devo impostare lo stesso file per tre volte giusto? Grazie ancora :)

Sì, dovrai ripeterlo.
Paul Dixon,

7
Non ho esperienza con cron, ma "0 0 28,29 2" non verrebbe eseguito due volte in un anno bisestile? Non che questo sarebbe un problema per i prossimi due anni, ma comunque ...
Wim ten Brink,

Questo è un buon punto, non è un modo semplice per evitarlo
Paul Dixon,

4

Non penso che tu possa farlo facilmente nel crontab.

Un'opzione sarebbe quella di impostare cronl'esecuzione dello script ogni giorno e quindi verificare che lo stesso script sia l'ultimo giorno del mese.


3

Immagino che cron abbia un carattere speciale 'L' pensato per questo scopo:

*    *    L    *    *    your_script.sh 

eseguirà il tuo script l'ultimo giorno di ogni mese

D'altro canto,

*    *    0    *    *    your_script.sh

Puoi anche specificare qualcosa come:

*    *    *    *    1,5L    your_scrript.sh

per eseguire lo script l'ultimo lunedì e venerdì di ogni mese

o

*    *    *    *    1    your_script.sh

per eseguire lo script ogni lunedì a mezzanotte.


0

Questo farà il lavoro:

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

exit 1
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.