Antworten:
Der Befehl in crontab wird mit ausgeführt, /bin/sh
damit Sie mithilfe der arithmetischen Erweiterung berechnen können, ob das aktuelle Minutenmodul 25 Null ist.
*/5 * * * * [ $(( $(date +%s) / 60 % 25 )) -eq 0 ] && your_command
cron
Führt den gesamten Befehl alle 5 Minuten aus, aber nur, wenn die aktuelle Minute (in Minuten seit der Epoche) von Modulo 25 Null ist your_command
.
Wie andere angemerkt haben, ist ein Tag nicht gleichmäßig durch 25 Minuten teilbar, sodass er nicht your_command
jeden Tag zur gleichen Zeit ausgeführt wird, sondern alle 25 Minuten.
Ihre beste Wette ist es, mit 20 Minuten oder 30 Minuten zu laufen.
Als nächstes sollten Sie alle 5 Minuten auslösen und dann eine interne Zählung oder einen internen Zeitstempel beibehalten und jeden 5. Auslöser ausführen, oder wenn seit dem letzten Durchlauf 25 Minuten vergangen sind.
Komplizierter wäre es, die korrekten Zeiten für einen Tag, beginnend um Mitternacht, zu ermitteln und den Fehler am Ende des Tages zu akzeptieren. Dies würde das Duplizieren des crontab-Eintrags auf die verschiedenen Stunden beinhalten.
Komplizierter als das wäre es, die Zeiten für einen ganzen Monat zu berechnen, was viele Kopien des crontab-Eintrags beinhalten würde, um die verschiedenen Kombinationen abzudecken.
Schließlich können Sie Ihren eigenen Always-On-Daemon implementieren und diesen für die Zeitplanung einsetzen.
Ich habe keine direkte Erfahrung damit, aber fcron scheint das zu tun, was Sie wollen. Gemäß seiner Dokumentation können Sie Frequenzen angeben:
# 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
sollte den Trick machen.
Lassen Sie mich kurz erklären, wo das Problem liegt. Die Eingabe von 25 in das Minutenfeld wird cron
ausgeführt, wenn die Minuten der aktuellen Zeit 25 entsprechen, dh einmal pro Stunde. Sie können eine Liste von Übereinstimmungen eingeben. Das Problem ist, dass 60 (Minuten einer Stunde) nicht durch 25 teilbar ist. Sie müssen daher mehrere Einträge basierend auf der Stunde hinzufügen. Das am wenigsten verbreitete Vielfache von 60 und 25 ist 300, also 5 * 60. Sie müssen also 5 Stunden durchlaufen, bis Sie wieder zu Ihrem ursprünglichen Start zurückkehren. beispielsweise:
0, 25, 50
15, 40
5, 30, 55
20, 45
10, 35
...
Aber auch hier ist 24 (Stunden pro Tag) nicht durch 5 teilbar, das am wenigsten verbreitete Vielfache von 5 & 24 ist einfach 5 * 24 = 120. & so weiter und so fort ...
Sie können mit dem letzten Änderungszeitpunkt einer Datei spielen
Erstellen Sie ein kleines Skript (zum Beispiel /usr/local/bin/age
), das das Alter einer Datei ausgibt:
#bin/sh
echo $(( $( date +%s ) - $( stat -c %Z $1 ) ))
Ihre Crontab würde so aussehen (vorausgesetzt, 25 Minuten entsprechen 1500 Sekunden, wenn ich recht habe)
* * * * * [ $(/usr/local/bin/fileage /var/tmp/your_command.offset) -gt 1500 ] && touch /var/tmp/your_command.offset && your_command
Beachten Sie, dass ich /var/tmp
anstelle von verwende, /tmp
da es laut FHS beim Herunterfahren / Starten des Systems nicht gelöscht werden soll.
Ich denke das folgende sollte funktionieren 0 0/25 * * *?