Potřebuji, aby se určitý skript spouštěl jednou za měsíc (ostatní, kteří si prohlížejí tuto otázku, mohou potřebovat, aby se spouštěl jednou za den/týden/rok/5 dní atd.).
Vím, že k tomu mohu použít cron s:
0 0 1 * * ./script.sh
Ale co když je stroj náhodou během tohoto intervalu offline (jako příklad se vypne 1. den v konkrétním měsíci).
Existuje elegantní řešení tohoto? Nebo bych musel do tohoto skriptu zahrnout podprogram, abych nastavil I've-run-this-month-already
hodnotu a pak každý den v měsíci (nebo při spouštění) spustí další skript, aby tuto hodnotu zkontroloval?
Aktualizace:
Potřebuji, aby se můj skript spouštěl jednou za měsíc na samém začátku měsíce. Při psaní skriptu k provedení řady věcí jsem vytvořil níže uvedený kus kódu. Dávám to sem jen pro případ, že to někomu přijde užitečné, až najde tuto otázku.
# 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
Přijatá odpověď:
K tomu můžete použít Anacron, je navržen tak, aby spouštěl úlohy v určitých intervalech, aniž by se předpokládalo, že je systém nepřetržitě zapnutý. Pokud se má úloha spouštět každý měsíc, Anacron zkontroluje, zda byla spuštěna v předchozím měsíci, a pokud ne, spustí ji (a nezapomeňte, že ji nemusí spouštět znovu další měsíc).
V derivátech Debianu Anacron pěkně spolupracuje s Cronem, aby se postaral o /etc/cron.{daily,weekly,monthly}
vhodně (takže jednoduše definujete svůj měsíční úkol jako měsíční úkol v /etc/cron.monthly
a bude správně spuštěn).
Na jiných systémech byste svůj měsíční úkol definovali v /etc/anacrontab
.