Kategória: Linux všeobecne

Zmenené: 3. január 2010

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?

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.