Problém s anacron
anacron je démon, ktorý slúži ako doplnok pre démona automatického vykonávania úloh (cron) pre stroje, ktoré nie sú spustené 24 hodín denne. Je to naozaj šikovný nástroj, ktorý mi však v posledných dňoch prestal fungovať. Prečo?
Obsah článku
Sám som nevedel prečo, tak som sa pustil do pátrania. Najprv však, niekoľko podrobností o anacron.
Popis anacron
Ako som spomenul v úvode, anacron slúži na spúšťanie periodicky sa opakujúcich úloh démona cron na strojoch, ktoré nebežia stále, teda typicky na osobných alebo prenosných počítačoch. Ide v podstate o to, cron má predvolene (v Debiane) nastavené, okrem iných, niektoré úlohy, ktoré sa spúšťajú periodicky v intervaloch:
- raz za deň (/etc/cron.daily)
- raz za týždeň (/etc/cron.weekly)
- raz za mesiac (/etc/cron.monthly)
Čas ich spustenia je nastavený v hlavnej tabuľke cronu /etc/crontab
:
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
Nebudem sa venovať podrobnostiam tohoto príkazu, len zdôrazním, že tieto úlohy sú spúšťané v uvedených intervaloch (denne, týždenne, mesačne) v čase medzi 6.25 až 6.52. Ak je v tejto dobe stroj zapnutý, je všetko v poriadku a jednotlivé úlohy sú vykonané. Ak však v tejto dobe stroj spustený nie je, úlohy vykonané nie sú. Napríklad môj počítač doma i v práci nie je v túto dobu spustený skoro nikdy, a to môže mať za následok, že tieto periodické úlohy proste nie sú vykonávané vôbec.Samozrejme, počítač bude fungovať aj bez nich. Otázka však znie ako a dokedy, pretože medzi týmito úlohami sú veci ako aktualizácia databázy pre locate, rotácia logov a podobne.
Ako riešenie tohoto problému prichádza práve anacron. Jeho úlohou je, okrem iného, spustenie týchto úloh v čase keď je spustený počítač. teda zvyčajne pri štarte systému, pri zobudení z uspania a podobne. anacron (anac(h)ronistický) zároveň rieši problém opakovaného spúšťania (pri opakovanom zapnutí/zobudení stroja) tak, aby úloha spúšťaná denne bola spustená naozaj iba raz za deň, týždenná raz za týždeň atď.
Implementácia
O samotné spúšťanie anacron po štarte systému sa stará štartovací
skript, umiestnený v /etc/init.d/anacron
. Tento skript je potom
spúšťaný v jednotlivých úrovniach behu systému pri:
/etc/rc0.d/K01anacron
/etc/rc1.d/K01anacron
/etc/rc2.d/S02anacron
/etc/rc3.d/S02anacron
/etc/rc4.d/S02anacron
/etc/rc5.d/S02anacron
/etc/rc6.d/K01anacron
V prípade InitV skriptov som našiel popis príkazu v súbore
/var/lib/update-rc.d/anacron
:
update-rc.d anacron start 89 2 3 4 5 . stop 11 0 1 6 .
Okrem spúšťania po štarte systému, je anacron spúšťaný aj ako úloha
cron, definovaná v /etc/cron.d/anacron
. Táto úloha nerobí nič iné,
len volá štartovací skript každý deň o 7.30:
30 7 * * * root test -x /etc/init.d/anacron && /usr/sbin/invoke-rc.d anacron start >/dev/null
A, ako som spomínal, je spúšťaný aj pri prebudení, o čo sa stará
skript /etc/apm/event.d/anacron
.
case "$1,$2" in
change,power|resume,*)
/usr/sbin/invoke-rc.d anacron start >/dev/null
;;
esac
Aby sa jednotlivé úlohy vykonávali naozaj len v zadaných intervaloch a
nie častejšie, ukladá si anacron informáciu o poslednom vykonaní úlohy
do adresára /var/spool/anacron
vo forme časovej značky v súboroch,
ktorých mená zodpovedajú menu úlohy:
-rw------- 1 root root 9 jan 3 12:23 cron.daily
-rw------- 1 root root 9 jan 2 19:43 cron.monthly
-rw------- 1 root root 9 jan 2 19:38 cron.weekly
Ak chcete robiť pokusy, či potrebujete aby bola niektorá úloha spustená znova, stačí zmazať príslušný súbor a vyvolať štartovací skript, napríklad:
invoke-rc.d anacron start
Konfigurácia
Nejaká veľká konfigurácia anacron potrebná nie je. anacron používa
obdobu tabuľky cron, umiestnenú /etc/anacrontab
, kde sú definované
jednotlivé úlohy:
1 5 cron.daily nice run-parts --report /etc/cron.daily
7 10 cron.weekly nice run-parts --report /etc/cron.weekly
@monthly 15 cron.monthly nice run-parts --report /etc/cron.monthly
Syntax tejto tabuľky je veľmi podobná tabuľke crontab a ďalšie podrobnosti o nej sú v anacrontab(5). Tu len krátko: prvý stĺpec udáva interval vykonávania v dňoch a druhý zase oneskorenie minútach. Oneskorenie je čas, za ktorý bude úloha spustená po štarte anacron.
Problém
No a po krátkom predstavení, čo to vlastne ten anacron je, samotný problém. Pred nejakým časom som si všimol, že sa mi neaktualizuje databáza súborov pre locate a po chvíľke pátrania som zistil, že je to tým, že anacron nevykonáva svoju úlohu.
Tip
Vďaka mojim pokusom o zistenie pôvodu problému som prišiel o informáciu, kedy anacron prestal fungovať, takže neviem aká zmena to spôsobila.
Pokiaľ anacron funguje ako má, objavujú sa systémovom logu
(/var/log/syslog
) záznamy ako tento:
Nov 14 07:30:01 bonifac anacron[29452]: Anacron 2.3 started on 2009-11-14
Nov 14 07:30:01 bonifac anacron[29452]: Jobs will be executed sequentially
Nov 14 07:30:01 bonifac anacron[29452]: Will run job `cron.daily' in 5 min.
Nov 14 07:30:01 bonifac anacron[29452]: Will run job `cron.monthly' in 15 min.
Nov 14 07:30:01 bonifac anacron[29452]: Will run job `cron.weekly' in 10 min.
Nov 14 07:35:01 bonifac anacron[13465]: Updated timestamp for job `cron.daily' to 2009-11-14
Nov 14 07:35:01 bonifac anacron[29452]: Job `cron.daily' started
Nov 14 07:36:19 bonifac anacron[29452]: Job `cron.daily' terminated
Nov 14 07:40:01 bonifac anacron[14285]: Updated timestamp for job `cron.weekly' to 2009-11-14
Nov 14 07:40:01 bonifac anacron[29452]: Job `cron.weekly' started
Nov 14 07:40:08 bonifac anacron[29452]: Job `cron.weekly' terminated
Nov 14 07:45:01 bonifac anacron[14642]: Updated timestamp for job `cron.monthly' to 2009-11-14
Nov 14 07:45:01 bonifac anacron[29452]: Job `cron.monthly' started
Nov 14 07:45:01 bonifac anacron[29452]: Job `cron.monthly' terminated
Nov 14 07:45:01 bonifac anacron[29452]: Normal exit (3 jobs run)
Samozrejme, nemusia byť spustené všetky tri úlohy, ale použil som kompletný príklad výpisu. Avšak moje záznamy obsahovali len tieto riadky:
Dec 31 15:51:12 bonifac anacron[2275]: Anacron 2.3 started on 2009-12-31
Dec 31 15:51:12 bonifac anacron[2275]: Jobs will be executed sequentially
Dec 31 15:51:12 bonifac anacron[2275]: Will run job `cron.daily' in 5 min.
Dec 31 15:51:12 bonifac anacron[2275]: Will run job `cron.monthly' in 15 min.
Dec 31 15:51:12 bonifac anacron[2275]: Will run job `cron.weekly' in 10 min.
A tieto záznamy sa opakovali pri každom spustení systému. Vlastne
hlavný rozdiel je v tom, že ani po jednom zázname neexistoval zápis o
spustení úlohy, či o ukončení anacron. Po dlhšom pátraní som narazil
na skript /usr/lib/pm-utils/power.d/anacron
, ktorého úlohou je
spustiť/zastaviť vykonávania anacron pri zmene stavu napájania
sieť/batéria.
Nepodarilo sa mi (zatiaľ) zistiť prečo je stav určovaný zle, ale
spúšťanie tohoto skriptu má za následok, že je anacron ukončený
predtým ako splní svoju úlohu, čím úlohy nie sú spúšťané vôbec. Po
chvíľke študovania dokumentácie som zistil, že pre vypnutie tohoto
skriptu stačí vytvoriť prázdny súbor s rovnakým menom v adresári
/etc/pm/power.d
:
touch/etc/pm/power.d/anacron
Záver
Od tejto chvíle už anacron robí to čo má. Avšak toto riešenie nie je dobré, pretože nerieši podstatu problému (zlý stav napájania), ale rieši len dôsledok problému (nebežiaci anacron). Moje vedomosti o správe napájania mi však zatiaľ nedovoľujú pátrať po probléme hlbšie.