cronjob tips

Cron este o unealta minunata, dar de cele mai multe ori este folosita gresit. Cateva greseli pe care le-am intalnit frecvent (si nu numai la mine ;-) ):

  • Surprinzator de multa lume exprima "la fiecare doua ore" sub forma "* */2 * * *". GRESIT! Asta inseamna "in fiecare minut in orele pare", sintaxa corecta este, de exemplu, "42 */2 * * *", adica "in orele pare, in minutul 42". Tine minte, * inseamna "in fiecare minut/ora/zi", notiunea de "o singura data" are nevoie de o valoare exacta.
  • Jumatate din utilitatea cronului este ca trimite rezultatul scriptului pe e-mail. Multa lume prefera sa dea redirect in /dev/null, sa scape de stress. E relativ simplu ca MTA-ul masinii sa fie corect configurat si respectivele e-mailuri sa ajunga la cineva care le citeste. Atunci cand ceva a mers gresit, vrei sa stii cat mai repede posibil. In aceeasi ordine de idei, mailul userului "root" trebuie sa ajunga la cineva.
  • Critica cea mai des intalnita asupra observatiei de mai sus este ca mailurile provenite in urma rularii cu succes a jobului respectiv duc la fenomenul "Petrica si lupul", urmand a fi in timp ignorate de sysadmin. De asemenea, cu un minim efort, se poate modifica scriptul (sau scrie un wrapper) astfel incat outputul normal (si doar el) sa fie ignorat. Orice altceva iese la stdout este prin urmare ceva atipic si merita trimis pe e-mail.
  • Daca tot exista acum un cron configurat frumos, merita instalat si programul logcheck, care functioneaza dupa un principiu similar: il inveti patternuri "normale", si el iti trimite frumos pe e-mail orice altceva din jurnalele la care se uita.
  • Si sa nu uit: cron ruleaza o data pe minut, nu-l poti folosi sa rulezi ceva la fiecare 30 de secunde, sa spunem.
  • De notat ca nu e necesara restartarea crond dupa fiecare editare de crontab, se prinde el singur in maxim un minut.
  • Alta mare frustrare se poate rezolva tinand minte ca nu se lasa pacalit daca schimbi data. Aici cred ca s-ar justifica repornirea crond, daca n-ar fi asa de simpla modificarea de reguli in crontab.
  • Multa lume foloseste cron ca sa reporneasca procese, ceea ce mi se pare oarecum peste mana. Este mult mai simplu sa se foloseasca inittab, de exemplu.
  • Daca scriptul dureaza mai mult decat perioada, well, vorba lui Walter Sobchak: "You're entering a world of pain".

5 Responses to “cronjob tips”

  1. bobo Says:

    Chiar daca nu poti rula la 30 sec, unde e nevoie mare – poti folosi un script de forma:

    func1 {
    }

    func1
    sleep 30
    func1

    sau in genul asta ;-)

  2. Cartex Says:

    Nice tips. Si care e sintaxa corecta pentru “in fiecare minut” si “in fiecare ora”?
    Thx

  3. petre Says:

    Hai domnule, aveam pretentii!

    * * * * * USER /cale/spre/script/la/minut

    respectiv

    5 * * * * USER /cale/spre/script/la/ora

    Evident, cazul din urma ruleaza in fiecare ora la “si cinci”.

  4. gcbirzan Says:

    De fapt. func1 {}; func1 & sleep 30; func1 :-)

  5. petre Says:

    Well, daca tii neaparat, se pot face hackuri, dar pt. rezolutii de timp asa mici incepe sa se recomande un daemon separat, dar mersi de tips, anyway. Mai ales cel al lui gcb, cu & si ; care ar trebui sa mearga la intervale mai regulate decat abordarea secventiala.

    Ah, si sa nu uit importanta nesuprapunerii scripturilor (fac si update la articol) ;-)