frame

Sveiki apsilankę!

Jei forume lankaisi pirmą kartą, kviečiame registruotis ir prisijungti prie diskusijų.

Prisijungti Registruotis

Periodinės Cron užduotys

IV_VygandasSIV_VygandasS Serverių ekspertas (-ė)
edited 2018 sausio 10 Į Informaciniai straipsniai
Cron yra laiku paremtas periodinių užduočių vykdymui naudojama tarnyba. Vartotojams cron leidžia periodiškai vykdyti jų pasirinktas komandas ar skriptus nurodant šių komandų įvykdymo tikslų laiką.

Sudarant ir redaguojant jau sukurtas periodines cron užduotis yra redaguojamas crontab failas.

Norint redaguoti crontab failą, naudojame sekančią komandą:
crontab -e

Crontab sitaksė

Įprastas periodinės cron užduoties aprašymas atrodo taip:
1 2 3 4 5 /path/to/command arg1 arg2

arba
1 2 3 4 5 /root/backup.sh

Kur,
  1. Minutės (0-59)
  2. Valandos (0-23)
  3. Dienos (0-31)
  4. Mėnesiai (0-12 [12 == Gruodis])
  5. Savaitės diena(0-7 [7 arba 0 == Sekmadienis])
/path/to/command - Norimas įvykdyti skriptas arba komanda.

Paprastas, tačiau patogus sintaksei įsiminti naudotinas formatas:
* * * * * command to be executed
- - - - -
| | | | |
| | | | ----- Day of week (0 - 7) (Sunday=0 or 7)
| | | ------- Month (1 - 12)
| | --------- Day of month (1 - 31)
| ----------- Hour (0 - 23)
------------- Minute (0 - 59)

Taip pat yra galimybė nurodyti kokio vartotojo vardu yra norima vykdyti numatyta komanda ar skriptas, naudojant tokią sintaksę:
1 2 3 4 5 VARTOTOJAS /path/to/command arg1 arg2

arba
1 2 3 4 5 VARTOTOJAS /path/to/script.sh

Pavyzdys: Įdiegiamas pavyzdinis skriptas:

Norint kad Jūsų serveryje kas parą, 03:00 laiku būtų vykdomas norimas skriptas, reikėtų naudoti sekančią komandų seką:
crontab -e

Pridėti sekančią eilutę:
0 3 * * * /root/backup.sh

Išsaugokite ir uždarykite failą.

Daugiau pavyzdžių:

Norint paleisti /path/to/command kiekvieną dieną 5 min. po vidurnakčio:
5 0 * * * /path/to/command

Norint paleisti /path/to/script.sh kiekvieno mėnesio pirmos dienos 14:15
15 14 1 * * /path/to/script.sh

Norint paleisti /scripts/phpscript.php šiokiadieniais 22:00 :
0 22 * * 1-5 /scripts/phpscript.php

Norint paleisti /root/scripts/perl/perlscript.pl kiekvieną dieną 00:23, 02:23, 04:23 ... :
23 0-23/2 * * * /root/scripts/perl/perlscript.pl

Norint paleisti /path/to/unixcommand 04:05 kiekvieną sekmadienį:
5 4 * * sun /path/to/unixcommand

Norint gauti esamų crontab užduočių sąrašą, naudojama ši komanda:
crontab -l

Norint gauti esamų crontab užduočių sąrašą, nurodant konkretų vartotoją:
crontab -l -u username

Taip pat siekiant vartotojui palengvinti esamų periodinių užduočių suprantamumą yra galimybė naudoti specialiai tam sudarytus laiku nurodyti žodinius pakaitalus:
[B]Žodinis pakaitalas[/B]	[B]Reikšmė[/B]
@reboot	                Paleisti vieną kartą, po serverio paleidimo.
@yearly	                Paleisti kartą metuose, "0 0 1 1 *".
@annually               (tas pats kaip ir @yearly)
@monthly                Paleisti kartą per mėnesį, "0 0 1 * *".
@weekly	                Paleisti kartą per savaitę, "0 0 * * 0".
@daily	                Paleisti kartą per dieną, "0 0 * * *".
@midnight               (tas pats kaip ir @daily)
@hourly	                Paleisti kartą per valandą, "0 * * * *".

Pavyzdys:
@hourly /path/to/script.sh

Naudojamų operatorių aprašymas

Operatoriai leidžia vartotojui nurodyti periodinėse cron užduotyse daugiareikšmius parametrus. Yra galimi trys operatoriai:
  • Žvaigždutė (*): nurodo visas galima reikšmės nurodytame laukelyje. Pavyzdžiui, žvaigždutės simbolis valandos laukelyje yra tolygus nurodytoms visoms valandų reikšmėms (kiekvienai valandai).
  • Kablelis (,): nurodo sąrašą reikšmių. Pavyzdžiui: "1,5,10,15,20, 25".
  • Brūkšnys (-): nurodo reikšmių intervalą. Pavyzdžiui: "5-15" dienos. Kas yra tolygu tokiam užrašymui, naudojant kablelio operatorių: ""5,6,7,8,9,....,13,14,15".

crontab failo turinys

Pagal nutylėjimą /etc/crontab failo turinys:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

Kuriame yra nurodoma, jog skriptams vykdyti bus naudojama /bin/bash aplinka. Bei nurodoma kokiais laiko periodais bus vykdomi /etc/cron.* kataloguose esantys skriptai.

Bendru atveju, pageidaujant kad tam tikras skriptas būtų vykdomas pvz. kiekvieną valandą, jį užtenka įkelti į /etc/cron.hourly katalogą.

Pagal nutylėjimą sistemoje esantys periodinių cron užduočių tikrinami katalogai:
  • /etc/cron.daily
  • /etc/cron.hourly
  • /etc/cron.monthly
  • /etc/cron.weekly
Atsarginės kopijos

Norint išsaugoti crontab periodinių užduočių atsargines kopijas, naudojamos šios komandos:
crontab -l > /home/test/users.root.bakup
crontab -u userName -l > /home/test/users.root.bakup

El. pašto pranešimų išjungimas

Pagal nutylėjimą įvykdžius cron periodinę užduotį, užduoties metu paleidžiamo skripto išeities kodas yra išsiunčiamas el. paštu į nurodyta lokalų el. pašto adresą. Jeigu norima specifinei cron užduočiai nurodyti nesiųsti išeities kodo, reikia įrašas norimą užduoti pridėti jos pabaigoje ">/dev/null 2>&1" kodo dalį.
0 3 * * * /root/backup.sh >/dev/null 2>&1

Jeigu norima nurodyti, kad skripto sugeneruotas išeities kodas būtų siunčiamas į specifinę el. pašto dėžutę (pvz. "testas@testas.lt"). Prieš tai reikia apibrėžti MAILTO kintamąjį.
MAILTO="testas@testas.lt"
0 3 * * * /root/backup.sh >/dev/null 2>&1

Prieigos prie periodinių cron užduočių vykdymo draudimas

Pagal nutylėjimą visi sisteminiai vartotojai turi prieigą vykdyti periodines cron užduotis. Pageidaujant, prieiga prie periodinių cron užduočių vykdymo yra reguliuojama įrašant pageidaujamu ir nepageidaujamus sistemos vartotojus į /etc/cron.allow ir /etc/cron.deny failus.
  • /etc/cron.allow - sistemos vartotojų sąrašas, kuriems yra suteikta galimybė vykdyti periodines cron užduotis.
  • /etc/cron.deny - sistemos vartotojų sąrašas, kuriems yra draudžiama galimybė vykdyti periodines cron užduotis.
Pavyzdys:

Pageidaujant, kad periodines cron užduotis vykdyti galėtų tik specifinis vartotojas, reikėtų pradžiai uždrausti visiems vartotojams vykdyti periodines cron užduotis /etc/cron.deny faile nurodant "ALL" reikšmę - taip uždraudžiant visiems vartotojams vykdyti periodines cron užduotis. O po to nurodyti pageidaujamą specifinį vartotoją /etc/cron.allow faile (pvz. vartotoją adminas) - taip suteikiant tik šiam sistemos vartotojui prieigą prie periodinių cron užduočių.

Būtų reikalingos įvykdyti šios komandos:
echo ALL >> /etc/cron.deny
echo adminas >> /etc/cron.allow
___
Naudingos nuorodos:

Periodinių cron užduočių kodo generavimo įrankiai:
Daugiau informacijos apie crontab įrankį galite rasti įvykdę šią komandą:
man crontab

Komentarai

  • moxfelvmoxfelv Naujokas (-ė)
    edited 2013 gegužės 23
    Galbūt naujokai nežinos ką daryti įvedus komandas, taigi:

    Reikėtų spausti CTRL + O ( Write out)
    Ir ENTER.

    Tai įrašys Root vartotojo cron tabą.
  • karolisitmarkskarolisitmarks Naujokas (-ė)
    edited 2013 gegužės 27
    Laba diena. Gal galėtumėte parašyti pavyzdį, kaip periodiškai nustatyti serverio perkrovimą, tarkime kiekvieną sekmadienį 02:00 nakties?
  • moxfelvmoxfelv Naujokas (-ė)
    edited 2013 gegužės 27
    O kam to reikia?
    Jei serveris neužsikraus, ar būsi pasiruošęs pranešti administratoriams?

    O komanda paprasta:

    0 2 * * 0 reboot
  • IV_VygandasSIV_VygandasS Serverių ekspertas (-ė)
    edited 2013 gegužės 27
    karolisitmarks parašė: »
    Laba diena. Gal galėtumėte parašyti pavyzdį, kaip periodiškai nustatyti serverio perkrovimą, tarkime kiekvieną sekmadienį 02:00 nakties?

    Kaip ir minėjo moxfelv, perkrovimas kiekvieną sekmadienį 02:00:
    0 2 * * 0 /sbin/reboot
    

    Paprastumo dėlei galite išmėginti automatinį crontab kodo generavimo įrankį apsilankę šiuo adresu.
  • rufasrufas Naujokas (-ė)
    edited 2013 birželio 26
    Naudoju tokią komandą:

    Skriptas leidžiamas labai dažnai ir kiekvieną kartą sukuriamas failiukas /root kataloge.
    Kaip padaryti kad jokie failiukai nebūtų kuriami ?
  • IV_VygandasSIV_VygandasS Serverių ekspertas (-ė)
    edited 2013 birželio 26
    rufas parašė: »
    Naudoju tokią komandą:


    Skriptas leidžiamas labai dažnai ir kiekvieną kartą sukuriamas failiukas /root kataloge.
    Kaip padaryti kad jokie failiukai nebūtų kuriami ?

    Jeigu Jūs pageidaujate, kad po atsiuntimo failai būtų trinami, Jūs galite naudoti --delete-after parametrą:
    wget --delete-after [url]http://www.xxxxxx.net/xxxxxxx.php[/url] > /dev/null 2>&1
    
  • domenaidomenai Naujokas (-ė)
    edited 2013 birželio 26
    rufai, jums turbut tik reikia kad ivykdytu php koda? tuomet geriau naudoti tokia komanda
    /usr/bin/php /kelias/iki/failo/failas.php
    tuomet nebus kuriami failiukai.
    Jei jums reikia ne to, tai atsiprasau uz siukslinima.
  • rufasrufas Naujokas (-ė)
    edited 2013 birželio 26
    To reikia, bet iš tiesų ir su --delete-after suveikė puikiai viskas :)
  • PyPKjEPyPKjE Naujokas (-ė)
    edited 2018 sausio 10
    Gal kam teko susidurti su šiais error'ais
    (*system*) ERROR (Missing newline before EOF, this crontab file will be ignored)
    /usr/sbin/cron[23745]: (CRON) INFO (Skipping @reboot jobs -- not system startup)
    Svarbiau būtu antras error'as daug pragooglinau įvairiausius sprendimus bandžiau padaryti nepavyko sutaisyti :/
Norėdami palikti komentarą, turite prisijungti arba registruokis.