Ich brauche ein bestimmtes Skript, das einmal im Monat ausgeführt wird (andere, die diese Frage sehen, müssen es möglicherweise einmal am Tag/Woche/Jahr/5 Tage usw. ausführen).
Ich weiß, dass ich cron dazu verwenden kann mit:
0 0 1 * * ./script.sh
Was aber, wenn das Gerät während dieses Zeitraums offline ist (z. B. Stromausfall am 1. eines bestimmten Monats).
Gibt es eine elegante Lösung dazu? Oder müsste ich eine Unterroutine in dieses Skript einfügen, um einen I've-run-this-month-already
zu setzen Wert, und dann wird jeden Tag des Monats (oder beim Booten) ein anderes Skript ausgeführt, um diesen Wert zu überprüfen?
Aktualisierung:
Ich muss mein Skript einmal im Monat ganz am Anfang des Monats ausführen. Beim Schreiben eines Skripts, um eine Reihe von Dingen zu erreichen, habe ich den folgenden Code erstellt. Ich stelle es hier nur für den Fall, dass jemand es nützlich findet, nachdem er diese Frage gefunden hat.
# CHECK FOR THE OLD_MONTH FILE
if [ ! -e /usr/local/bin/system/old_month ]; then
# CREATE IT IF IT DOESN'T EXIST WITH THIS MONTHS DATE
echo `date` | awk '{print $2,$6}' > /usr/local/bin/system/old_month
fi
# CREATE A NEW FILE EVERY TIME THIS SCRIPT IS RUN WITH THIS MONTHS DATE
echo `date` | awk '{print $2,$6}' > /usr/local/bin/system/this_month
# CHECK IF OLD_MONTH AND THIS_MONTH ARE NOT THE SAME
if ! cmp /usr/local/bin/system/this_month /usr/local/bin/system/old_month > /dev/null 2>&1 ;
then
# RUN YOUR RELEVANT CODE HERE #
echo `date` | awk '{print $2,$6}' > /usr/local/bin/system/old_month # UPDATE THE VALUE IN OLD_MONTH SO THAT THEY WILL MATCH NEXT TIME
fi
Akzeptierte Antwort:
Sie können dafür Anacron verwenden, es wurde entwickelt, um Jobs in bestimmten Intervallen auszuführen, ohne davon auszugehen, dass das System ständig eingeschaltet ist. Wenn ein Job jeden Monat ausgeführt werden soll, prüft Anacron, ob er im vorherigen Monat ausgeführt wurde, und führt ihn aus, wenn dies nicht der Fall ist (und denken Sie daran, dass er ihn nicht für einen weiteren Monat erneut ausführen muss).
In Debian-Derivaten arbeitet Anacron gut mit Cron zusammen, um sich um /etc/cron.{daily,weekly,monthly}
zu kümmern entsprechend (also definieren Sie Ihre monatliche Aufgabe einfach als monatlichen Job in /etc/cron.monthly
, und es wird entsprechend ausgeführt).
Auf anderen Systemen würden Sie Ihre monatliche Aufgabe in /etc/anacrontab
definieren .