Risposte:
Il comando in crontab viene eseguito con in /bin/sh
modo da poter usare l'espansione aritmetica per calcolare se il minuto corrente modulo 25 è uguale a zero:
*/5 * * * * [ $(( $(date +\%s) / 60 \% 25 )) -eq 0 ] && your_command
cron
eseguirà questa intera voce ogni 5 minuti, ma solo se il minuto corrente (in minuti dall'epoca) modulo 25 è uguale a zero verrà eseguito your_command
.
Come altri hanno sottolineato, 1 giorno non è uniformemente divisibile per 25 minuti, quindi questo non farà your_command
funzionare alla stessa ora ogni giorno, ma verrà eseguito ogni 25 minuti.
La tua scommessa migliore è correre a 20 minuti o 30 minuti.
Il prossimo passo potrebbe essere quello di innescare ogni 5 minuti, quindi mantenere un conteggio o un timestamp interni ed eseguire ogni 5 ° trigger o se sono trascorsi 25 minuti dall'ultima corsa.
Sarebbe più complicato elaborare gli orari corretti per un giorno, a partire da mezzanotte, e accettare l'errore alla fine della giornata. Ciò implicherebbe la duplicazione della voce crontab nelle diverse ore.
Più complicato di questo sarebbe calcolare i tempi per un mese intero, il che implicherebbe molte copie della voce crontab per coprire le diverse combinazioni.
Finalmente puoi implementare il tuo sempre sul demone e farlo fare la pianificazione.
Non ho esperienza diretta con esso, ma fcron sembra fare ciò che vuoi fuori dalla scatola. Secondo la sua documentazione è possibile specificare le frequenze:
# Get our mails every 30 minutes
@ 30 getmails -all
# make some security tests every 48 hours of system up time,
# force a mail to be sent to root even if there is no output
@mailto(root),forcemail 2d /etc/security/msec/cron-sh/security.sh
@ 25 command
dovresti fare il trucco.
Permettetemi di spiegare in breve qual è il problema qui. L'immissione di 25 nel campo dei minuti provoca cron
l'esecuzione quando i minuti dell'ora corrente equivalgono a 25, ovvero una volta ogni ora. È possibile inserire un elenco di corrispondenze, il problema è che 60 (minuti di un'ora) non sono divisibili per 25, quindi è necessario aggiungere più voci in base all'ora. Il minimo comune multiplo di 60 e 25 è 300, ovvero 5 * 60. Quindi dovrai scorrere 5 ore fino a tornare al punto di partenza originale. per esempio:
0, 25, 50
15, 40
5, 30, 55
20, 45
10, 35
...
Ma anche in questo caso, 24 (ore al giorno) non è divisibile per 5, il minimo comune multiplo di 5 e 24 è semplicemente 5 * 24 = 120. e così via e così via ...
Puoi giocare con l'ora dell'ultima modifica di un file
Crea un piccolo script (ad esempio /usr/local/bin/age
) che genererà l'età di un file:
#bin/sh
echo $(( $( date +%s ) - $( stat -c %Z $1 ) ))
Il tuo crontab sarebbe simile a questo (supponendo 25 minuti equivalgono a 1500 secondi se ho ragione)
* * * * * [ $(/usr/local/bin/fileage /var/tmp/your_command.offset) -gt 1500 ] && touch /var/tmp/your_command.offset && your_command
Si noti che io uso /var/tmp
invece che /tmp
perché secondo l' FHS non dovrebbe essere cancellato allo spegnimento / avvio del sistema.
Penso che il seguente dovrebbe funzionare 0 0/25 * * *?