Cron kwiLinux: imbali, ukusetyenziswa kunye nesixhobo

Cron kwiLinux: imbali, ukusetyenziswa kunye nesixhobo

I-classic yabhala ukuba iiyure ezivuyayo azibukeli. Ngaloo maxesha asendle kwakungekho baprogram okanye i-Unix, kodwa namhlanje abaprogram bayazi ngokuqinisekileyo: i-cron iya kugcina umkhondo wexesha endaweni yabo.

Izinto eziluncedo zomgca womyalelo zombini zibuthathaka kwaye zingumsebenzi kum. sed, awk, wc, cut kunye nezinye iinkqubo ezindala ziqhutywa zizikripthi kwiiseva zethu yonke imihla. Uninzi lwazo luyilwe njengemisebenzi yecron, umcwangcisi osuka kwi-70s.

Kwangexesha elide ndisebenzisa i-cron ngokukhawuleza, ngaphandle kokungena kwiinkcukacha, kodwa ngenye imini, xa ndidibana nephutha xa ndiqhuba iskripthi, ndagqiba ekubeni ndijonge kuyo ngokupheleleyo. Le yindlela eli nqaku elivele ngayo, ngelixa ndilibhala ndiye ndaqhelana nePOSIX crontab, olona khetho luphambili lwecron kunikezelo oludumileyo lweLinux kunye nesakhiwo sezinye zazo.

Ngaba usebenzisa iLinux kwaye uqhuba imisebenzi yecron? Ngaba unomdla kuyilo lwesicelo senkqubo kwi-Unix? Emva koko sisendleleni!

Iziqulatho

Imvelaphi yeentlobo

Ukwenziwa ngamaxesha athile komsebenzisi okanye iinkqubo zenkqubo yimfuneko ecacileyo kuzo zonke iinkqubo zokusebenza. Ke ngoko, abadwelisi benkqubo babone isidingo seenkonzo ezibavumela ukuba bacwangcise kwaye benze imisebenzi kwakudala.

Iinkqubo zokusebenza ezifana ne-Unix zilandelela imvelaphi yazo kwi-Version 7 ye-Unix, ephuhliswe kwi-70 yenkulungwane yokugqibela e-Bell Labs, kubandakanywa no-Ken Thompson odumileyo. Inguqulo ye-7 ye-Unix ikwaquka i-cron, inkonzo yokusebenza rhoqo kwimisebenzi ye-superuser.

I-cron eqhelekileyo yale mihla yinkqubo elula, kodwa i-algorithm yokusebenza yenguqulelo yokuqala yayilula ngakumbi: inkonzo yavuka kanye ngomzuzu, yafunda itafile enemisebenzi evela kwifayile enye (/etc/lib/crontab) kwaye yenzelwe superuser loo misebenzi bekufanele ukuba yenziwe ngoku.

Emva koko, iinguqulelo eziphuculweyo zenkonzo elula neluncedo zabonelelwa ngazo zonke iinkqubo zokusebenza ezifana ne-Unix.

Iinkcazo eziqhelekileyo zefomathi ye-crontab kunye nemigaqo esisiseko yokusebenza kwe-utility ifakwe kumgangatho oyintloko we-Unix-like operating systems - POSIX - kwi-1992, kwaye ngaloo ndlela i-cron esuka kwi-de facto standard yaba ngumgangatho we-de jure.

Kwi-1987, uPaul Vixie, emva kokuvavanya abasebenzisi be-Unix malunga neminqweno yabo ye-cron, wakhulula enye inguqu ye-daemon eyalungisa ezinye iingxaki ze-cron yendabuko kwaye yandisa i-syntax yeefayile zetafile.

Ngohlobo lwesithathu lwe-Vixie cron yaqala ukuhlangabezana neemfuno ze-POSIX, ukongeza, inkqubo yayinelayisenisi yenkululeko, okanye kunoko kwakungekho layisensi kwaphela, ngaphandle kweminqweno kwi-README: umbhali akaniki ziqinisekiso, igama lombhali ayinakucinywa, kwaye inkqubo inokuthengiswa kuphela kunye nekhowudi yemvelaphi. Ezi mfuno ziye zangqineka zihambelana nemigaqo yesoftware yasimahla eyayifumana ukuthandwa ngaloo minyaka, ngoko ke ezinye zezinto eziphambili zokusasazwa kweLinux ezavela kwiminyaka yoo-90s zathatha iVixie cron njengenkqubo yabo enye kwaye basayiphuhlisa nanamhlanje.

Ngokukodwa, i-Red Hat kunye ne-SUSE ziphuhlisa ifolokhwe ye-Vixie cron - cronie, kunye no-Debian kunye no-Ubuntu basebenzisa i-original edition ye-Vixie cron kunye neepatches ezininzi.

Masiqale siqhelane ne-crontab yomsebenzisi echazwe kwi-POSIX, emva koko siza kujonga izandiso ze-syntax ezinikezwe kwi-Vixie cron kunye nokusetyenziswa kokwahluka kwe-Vixie cron kwi-Linux ethandwayo. Kwaye ekugqibeleni, i-cherry kwikhekhe luhlalutyo lwesixhobo se-cron daemon.

POSIX crontab

Ukuba i-cron yasekuqaleni ihlala isebenzela umphathi omkhulu, abacwangcisi banamhlanje bahlala bejongana nemisebenzi yabasebenzisi abaqhelekileyo, ekhuseleke ngakumbi kwaye ilungele.

IiCrons zibonelelwa njengeseti yeenkqubo ezimbini: icron daemon eqhuba rhoqo kunye necrontab eluncedo efumanekayo kubasebenzisi. Le yokugqibela ikuvumela ukuba uhlele iitheyibhile zemisebenzi ethile kumsebenzisi ngamnye kwinkqubo, ngelixa i-daemon iqalisa imisebenzi esuka kumsebenzisi kunye neetafile zenkqubo.

В POSIX umgangatho ukuziphatha kwedaemon akuchazwanga nangayiphi na indlela kwaye kuphela inkqubo yomsebenzisi eyenziwe ngokusesikweni icrontab. Ubukho beendlela zokusungula imisebenzi yabasebenzisi, ngokuqinisekileyo, buchazwa, kodwa abuchazwanga ngokweenkcukacha.

Ngokubiza usetyenziso lwecrontab, unokwenza izinto ezine: hlela itafile yomsebenzisi kumhleli, layisha itafile kwifayile, bonisa itafile yomsebenzi yangoku, kwaye ucime itafile yomsebenzi. Imizekelo yendlela i-crontab esebenza ngayo:

crontab -e # редактировать таблицу задач
crontab -l # показать таблицу задач
crontab -r # удалить таблицу задач
crontab path/to/file.crontab # загрузить таблицу задач из файла

Xa ufowuna crontab -e umhleli obaluliweyo kuguquguquko lwemekobume esemgangathweni uyakusetyenziswa EDITOR.

Imisebenzi ngokwayo ichazwe ngolu hlobo lulandelayo:

# строки-комментарии игнорируются
#
# задача, выполняемая ежеминутно
* * * * * /path/to/exec -a -b -c
# задача, выполняемая на 10-й минуте каждого часа
10 * * * * /path/to/exec -a -b -c
# задача, выполняемая на 10-й минуте второго часа каждого дня и использующая перенаправление стандартного потока вывода
10 2 * * * /path/to/exec -a -b -c > /tmp/cron-job-output.log

Iinkalo zokuqala ezintlanu zeerekhodi: imizuzu [1..60], iiyure [0..23], iintsuku zenyanga [1..31], iinyanga [1..12], iintsuku zeveki [0. .6], apho u-0 ngeCawa. Eyokugqibela, eyesithandathu, ibala ngumgca oza kwenziwa yitoliki yomyalelo oqhelekileyo.

Kwimimandla emihlanu yokuqala, amaxabiso anokudweliswa ngokwahlulwe ngeekoma:

# задача, выполняемая в первую и десятую минуты каждого часа
1,10 * * * * /path/to/exec -a -b -c

Okanye ngeqhagamshela:

# задача, выполняемая в каждую из первых десяти минут каждого часа
0-9 * * * * /path/to/exec -a -b -c

Ukufikelela komsebenzisi kucwangciso lomsebenzi kulawulwa kwi-POSIX nge-cron.allow kunye neefayile ze-cron.deny, ezidwelisa abasebenzisi abanokufikelela kwi-crontab kunye nabasebenzisi ngaphandle kokufikelela kwinkqubo, ngokulandelanayo. Umgangatho awulawuli indawo yezi fayile nangayiphi na indlela.

Ngokomgangatho, ubuncinci izinto ezine eziguquguqukayo zokusingqongileyo kufuneka zigqithiswe kwiinkqubo ezisungulwe:

  1. IKHAYA - uluhlu lwasekhaya lomsebenzisi.
  2. LOGNAME - ukungena komsebenzisi.
  3. UMENDO yindlela apho unokufumana khona izixhobo ezisemgangathweni zesixokelelwano.
  4. SHELL — indlela eya kwitoliki yomyalelo esetyenzisiweyo.

Ngokucacileyo, i-POSIX ayithethi nto malunga nokuba amaxabiso ala magama avela phi.

Umthengisi ogqwesileyo-Vixie cron 3.0pl1

Ukhokho oqhelekileyo wee-cron ezahlukeneyo ezithandwayo nguVixie cron 3.0pl1, owaziswa kwi-comp.sources.unix uluhlu lokuposa kwi-1992. Siza kuqwalasela iimpawu eziphambili zale nguqulo ngokubanzi.

I-Vixie cron iza kwiiprogram ezimbini (i-cron kunye ne-crontab). Njengesiqhelo, i-daemon inoxanduva lokufunda nokuqhuba imisebenzi ukusuka kwitafile yomsebenzi wenkqubo kunye neetafile zomsebenzisi ngamnye, kwaye i-crontab utility inoxanduva lokuhlela iitafile zomsebenzisi.

Itheyibhile yomsebenzi kunye neefayile zoqwalaselo

Itheyibhile yomsebenzisi omkhulu ibekwe kwi/etc/crontab. I-syntax yetheyibhile yenkqubo ihambelana ne-syntax ye-Vixie cron, ngaphandle kokuba ikholamu yesithandathu kuyo ibonisa igama lomsebenzisi oqaliswe phantsi kwakhe umsebenzi:

# Запускается ежеминутно от пользователя vlad
* * * * * vlad /path/to/exec

Iitafile zomsebenzi oqhelekileyo zibekwe kwi-/var/cron/tabs/igama lomsebenzisi kwaye zisebenzisa i-syntax efanayo. Xa usebenzisa i-crontab eluncedo njengomsebenzisi, ezi ziifayile ezihleliweyo.

Uluhlu lwabasebenzisi abanokufikelela kwi-crontab lulawulwa kwi / var / cron / vumela kunye / var / cron / ukuphika iifayile, apho ufuna nje ukufaka igama lomsebenzisi kumgca ohlukeneyo.

I-syntax eyandisiweyo

Xa kuthelekiswa nePOSIX crontab, isisombululo sikaPaul Vixey siqulethe iinguqulelo ezininzi eziluncedo kakhulu kwi-syntax yeetafile zomsebenzi wenkonzo.

Isivakalisi esitsha setafile sele sikhona: umzekelo, ungakhankanya iintsuku zeveki okanye iinyanga ngegama (ngoMvulo, ngoLwesibini, njalo njalo):

# Запускается ежеминутно по понедельникам и вторникам в январе
* * * Jan Mon,Tue /path/to/exec

Ungakhankanya inyathelo apho imisebenzi iqaliswa khona:

# Запускается с шагом в две минуты
*/2 * * * Mon,Tue /path/to/exec

Amanyathelo kunye namathuba angaxutywa:

# Запускается с шагом в две минуты в первых десять минут каждого часа
0-10/2 * * * * /path/to/exec

Iindlela ezicacileyo ezinokusetyenziswa kwi-syntax yesiqhelo ziyaxhaswa (ukuqalisa kwakhona, ngonyaka, ngonyaka, ngenyanga, ngeveki, yonke imihla, ezinzulwini zobusuku, ngeyure):

# Запускается после перезагрузки системы
@reboot /exec/on/reboot
# Запускается раз в день
@daily /exec/daily
# Запускается раз в час
@hourly /exec/daily

Indawo yokwenziwa komsebenzi

IVixie cron ikuvumela ukuba utshintshe indawo yokusebenza kwezicelo.

Utshintsho lwemekobume USER, LOGNAME ne HOME azibonelelwanga ngokulula yidaemon, kodwa zithathwe kwifayile. passwd. Uluhlu lwe- PATH lusetelwe ku- "/usr/bin:/bin" kwaye uguqulo lwe-SHELL lusetelwe ku-"/bin/sh". Amaxabiso azo zonke iinguqu ngaphandle kwe-LOGNAME zinokutshintshwa kwiitafile zabasebenzisi.

Ezinye izinto eziguquguqukayo zemekobume (ingakumbi i-SHELL kunye neKHAYA) zisetyenziswa yi-cron ngokwayo ukuqhuba umsebenzi. Nantsi into yokusebenzisa i-bash endaweni ye-sh eqhelekileyo ukuqhuba imisebenzi yesiko inokubonakala ngathi:

SHELL=/bin/bash
HOME=/tmp/
# exec будет запущен bash-ем в /tmp/
* * * * * /path/to/exec

Ekugqibeleni, zonke izinto eziguquguqukayo zokusingqongileyo ezichazwe kwitheyibhile (ezisetyenziswa yi-cron okanye zifunwa yinkqubo) ziya kudluliselwa kumsebenzi osebenzayo.

Ukuhlela iifayile, icrontab isebenzisa umhleli oxelwe kwi-VISUAL okanye UMHLELI oguquguqukayo wemekobume. Ukuba imeko-bume apho icrontab yayiqhutywa khona ayinazo ezi ziguquguqukayo zichaziweyo, ngoko "/usr/ucb/vi" kusetyenziswa (ucb mhlawumbi yiYunivesithi yaseCalifornia, eBerkeley).

cron kwiDebian kunye noBuntu

Abaphuhlisi beDebian kunye nokuhanjiswa kwe-derivative bakhululiwe uguqulelo olulungiswe kakhulu Uguqulelo lweVixie cron 3.0pl1. Akukho mahluko kwi-syntax yeefayile zetafile; kubasebenzisi iyafana Vixie cron. Eyona nto iNtsha inkulu: Inkxaso syslog, SELinux и WFP.

Utshintsho olubonakalayo oluncinci, kodwa olubonakalayo lubandakanya indawo yeefayile zoqwalaselo kunye neetafile zomsebenzi.

Iitafile zabasebenzisi kwiDebian zibekwe kwi/var/spool/cron/crontabs directory, itafile yesistim isekhona-ku/etc/crontab. Ipakethe yeDebian-itheyibhile yomsebenzi othile ibekwe kwi /etc/cron.d, ukusuka apho icron daemon izifunda ngokuzenzekelayo. Ulawulo lokufikelela komsebenzisi lulawulwa ngu /etc/cron.allow kunye /etc/cron.deny iifayile.

Iqokobhe elingagqibekanga lisengu/bin/sh, apho kwiDebian liqokobhe elincinane elithobelayo lePOSIX dash, yaziswa ngaphandle kokufunda naluphi na uqwalaselo (kwimo engasebenziyo).

I-Cron ngokwayo kwiinguqulelo zamva nje zeDebian iqaliswe nge-systemd, kwaye ukucwangciswa kokuqaliswa kunokujongwa kwi /lib/systemd/system/cron.service. Akukho nto ikhethekileyo kuqwalaselo lwenkonzo; naluphi na ulawulo lomsebenzi olufihlakeleyo lunokwenziwa ngokuguquguquka kwendalo okubhengezwe ngokuthe ngqo kwicrontab yomsebenzisi ngamnye.

cronie kwiRedHat, Fedora kunye neCentOS

ikoni - ifolokhwe yeVixie cron version 4.1. NjengakwiDebian, i-syntax ayitshintshanga, kodwa inkxaso ye-PAM kunye ne-SELinux, isebenza kwiqela, ukulandelela iifayile usebenzisa i- inotify kunye nezinye iimpawu zongeziwe.

Uqwalaselo olungagqibekanga lukwiindawo eziqhelekileyo: itafile yesistim ingaphakathi /etc/crontab, iipakethe zibeka iitafile zazo kwi/etc/cron.d, iitafile zabasebenzisi zingena kwi/var/spool/cron/crontabs.

Idaemon iqhuba phantsi kolawulo lwenkqubo, ubumbeko lwenkonzo ngu/lib/systemd/system/crond.service.

Kusasazo olufana ne-Red Hat, /bin/sh isetyenziswa ngokungagqibekanga ekuqaleni, eyi-bash eqhelekileyo. Kufuneka kuqatshelwe ukuba xa uqhuba imisebenzi yecron nge/bin/sh, iqokobhe le-bash liqala kwimo ehambelanayo yePOSIX kwaye ayifundi naluphi na uqwalaselo olongezelelweyo, olusebenza kwimo engasebenziyo.

cronie kwi-SLES kunye ne-openSUSE

Usasazo lwaseJamani lwe-SLES kunye ne-derivative yayo i-openSUSE isebenzisa i-cronie efanayo. Idaemon apha iphinde iqaliswe phantsi kwe-systemd, uqwalaselo lwenkonzo lubekwe kwi/usr/lib/systemd/system/cron.service. Ubumbeko: /etc/crontab, /etc/cron.d, /var/spool/cron/tabs. /bin/sh ikwayi-bash efanayo esebenza kwi-POSIX-indlela engahambisaniyo yonxibelelwano.

Isixhobo seVixie cron

Inzala yanamhlanje ye-cron ayizange itshintshe kakhulu xa ithelekiswa neVixie cron, kodwa ifumene iimpawu ezintsha ezingafunekiyo ukuqonda imigaqo yeprogram. Uninzi lwezi zandiso ziyilwe kakubi kwaye zibhidekisa ikhowudi. Ikhowudi yomthombo wecron yokuqala nguPaul Vixey kuyonwabisa ukufunda.

Ngoko ke, ndagqiba ekubeni ndihlalutye isixhobo se-cron usebenzisa umzekelo weprogram ye-cron eqhelekileyo kuwo omabini amasebe ophuhliso - Vixie cron 3.0pl1. Ndiza kuyenza lula imizekelo ngokususa ifdefs enzima ukufunda kunye nokushiya iinkcukacha ezincinci.

Umsebenzi wedemon unokwahlulwa ube ngamanqanaba amaninzi:

  1. Ukuqaliswa kwenkqubo.
  2. Ukuqokelela kunye nokuhlaziya uluhlu lwemisebenzi ekufuneka iqhutywe.
  3. Eyona cron loop isebenza.
  4. Qala umsebenzi.

Masizijonge ngokulandelelana kwazo.

Ukuqaliswa

Xa iqalisiwe, emva kokujonga iingxoxo zenkqubo, i-cron ifaka i-SIGCHLD kunye ne-SIGHUP abaphathi besignali. Eyokuqala yenza i-log yokungena malunga nokupheliswa kwenkqubo yomntwana, eyesibini ivala inkcazo yefayile yefayile yelog:

signal(SIGCHLD, sigchld_handler);
signal(SIGHUP, sighup_handler);

Icron daemon ihlala ibaleka yodwa kwisistim, kuphela njengomsebenzisi omkhulu kwaye isuka kulawulo oluphambili lwecron. Ezi fowuni zilandelayo zenza ifayile yokutshixa nge-PID yenkqubo ye-daemon, qiniseka ukuba umsebenzisi uchanekile kwaye utshintshe uvimba weefayili wangoku kowona uphambili:

acquire_daemonlock(0);
set_cron_uid();
set_cron_cwd();

Indlela engagqibekanga isetiwe, eya kusetyenziswa xa kuqaliswa iinkqubo:

setenv("PATH", _PATH_DEFPATH, 1);

Emva koko inkqubo "i-daemonized": yenza ikopi yomntwana yenkqubo ngokufowunela ifolokhwe kunye neseshoni entsha kwinkqubo yomntwana (ubiza isixhobod). Inkqubo yomzali ayisafuneki, kwaye iyaphuma:

switch (fork()) {
case -1:
    /* критическая ошибка и завершение работы */
    exit(0);
break;
case 0:
    /* дочерний процесс */
    (void) setsid();
break;
default:
    /* родительский процесс завершает работу */
    _exit(0);
}

Ukupheliswa kwenkqubo yomzali kukhulula iqhaga kwifayile yokutshixa. Ukongeza, kuyafuneka ukuhlaziya i-PID kwifayile kumntwana. Emva koku, i-database yomsebenzi izaliswe:

/* повторный захват лока */
acquire_daemonlock(0);

/* Заполнение БД  */
database.head = NULL;
database.tail = NULL;
database.mtime = (time_t) 0;
load_database(&database);

Emva koko i-cron iqhubela phambili kumjikelo oyintloko womsebenzi. Kodwa ngaphambi koko, kufanelekile ukujonga ukulayisha uluhlu lwemisebenzi.

Ukuqokelela kunye nokuhlaziya uluhlu lwemisebenzi

Umsebenzi we-load_database unoxanduva lokulayisha uluhlu lwemisebenzi. Ijonga inkqubo ephambili yecrontab kunye nolawulo oluneefayile zomsebenzisi. Ukuba iifayile kunye nolawulo alutshintshanga, uluhlu lwemisebenzi aluphinda lufundwe. Ngaphandle koko, uluhlu olutsha lwemisebenzi luqala ukwenza.

Ilayisha ifayile yenkqubo enefayile ekhethekileyo kunye namagama etafile:

/* если файл системной таблицы изменился, перечитываем */
if (syscron_stat.st_mtime) {
    process_crontab("root", "*system*",
    SYSCRONTAB, &syscron_stat,
    &new_db, old_db);
}

Ilayisha iitafile zabasebenzisi kwiluphu:

while (NULL != (dp = readdir(dir))) {
    char    fname[MAXNAMLEN+1],
            tabname[MAXNAMLEN+1];
    /* читать файлы с точкой не надо*/
    if (dp->d_name[0] == '.')
            continue;
    (void) strcpy(fname, dp->d_name);
    sprintf(tabname, CRON_TAB(fname));
    process_crontab(fname, fname, tabname,
                    &statbuf, &new_db, old_db);
}

Emva koko i-database endala ifakwe entsha.

Kule mizekelo ingasentla, umnxeba wenkqubo_crontab uqinisekisa ukuba umsebenzisi ohambelana negama lefayile yetafile ukhona (ngaphandle kokuba ngumsebenzisi omkhulu) kwaye emva koko ubiza u-load_user. Le yokugqibela sele ifunde ifayile ngokwayo ngomgca:

while ((status = load_env(envstr, file)) >= OK) {
    switch (status) {
    case ERR:
        free_user(u);
        u = NULL;
        goto done;
    case FALSE:
        e = load_entry(file, NULL, pw, envp);
        if (e) {
            e->next = u->crontab;
            u->crontab = e;
        }
        break;
    case TRUE:
        envp = env_set(envp, envstr);
        break;
    }
}

Apha, nokuba imo engqongileyo iguquguqukayo (imigca yefom ye-VAR=value) isebenzisa i-load_env / env_set imisebenzi, okanye inkcazo yomsebenzi ifundwe (* * * * * /path/to/exec) usebenzisa umsebenzi_entry.

Iqumrhu elingenayo elibuyisela i-load_entry ngumsebenzi wethu, obekwe kuluhlu oluqhelekileyo lwemisebenzi. Umsebenzi ngokwawo uqhuba ulwahlulo lwe-verbose yefomathi yexesha, kodwa sinomdla ngakumbi ekwenziweni kwezinto eziguquguqukayo zemo engqongileyo kunye neeparamitha zokuqaliswa komsebenzi:

/* пользователь и группа для запуска задачи берутся из passwd*/
e->uid = pw->pw_uid;
e->gid = pw->pw_gid;

/* шелл по умолчанию (/bin/sh), если пользователь не указал другое */
e->envp = env_copy(envp);
if (!env_get("SHELL", e->envp)) {
    sprintf(envstr, "SHELL=%s", _PATH_BSHELL);
    e->envp = env_set(e->envp, envstr);
}
/* домашняя директория */
if (!env_get("HOME", e->envp)) {
    sprintf(envstr, "HOME=%s", pw->pw_dir);
    e->envp = env_set(e->envp, envstr);
}
/* путь для поиска программ */
if (!env_get("PATH", e->envp)) {
    sprintf(envstr, "PATH=%s", _PATH_DEFPATH);
    e->envp = env_set(e->envp, envstr);
}
/* имя пользовтеля всегда из passwd */
sprintf(envstr, "%s=%s", "LOGNAME", pw->pw_name);
e->envp = env_set(e->envp, envstr);

I-loop engundoqo isebenza noluhlu lwangoku lwemisebenzi.

Ilophu engundoqo

I-cron yantlandlolo evela kwi-Version 7 ye-Unix isebenze ngokulula: yaphinda yafunda uqwalaselo kwi-loop, yazisa imisebenzi yomzuzu wangoku njengomsebenzi omkhulu, kwaye yalala kwada kwaqala umzuzu olandelayo. Le ndlela ilula koomatshini abadala yayifuna izixhobo ezininzi kakhulu.

Enye inguqulelo yacetywa kwi-SysV, apho i-daemon iye yalala khona de kube ngumzuzu okufutshane apho umsebenzi uchazwe khona, okanye imizuzu engama-30. Izibonelelo ezimbalwa zisetyenzisiwe ukuze kufundwe kwakhona uqwalaselo kunye nokutshekisha imisebenzi kule modi, kodwa ukuhlaziya ngokukhawuleza uluhlu lwemisebenzi kuye kwaba nzima.

UVixie cron ubuyele ekujongeni uluhlu lwemisebenzi kanye ngomzuzu, ngethamsanqa ekupheleni kweminyaka engama-80 bekukho izixhobo ezingakumbi koomatshini be-Unix abaqhelekileyo:

/* первичная загрузка задач */
load_database(&database);
/* запустить задачи, поставленные к выполнению после перезагрузки системы */
run_reboot_jobs(&database);
/* сделать TargetTime началом ближайшей минуты */
cron_sync();
while (TRUE) {
    /* выполнить задачи, после чего спать до TargetTime с поправкой на время, потраченное на задачи */
    cron_sleep();

    /* перечитать конфигурацию */
    load_database(&database);

    /* собрать задачи для данной минуты */
    cron_tick(&database);

    /* перевести TargetTime на начало следующей минуты */
    TargetTime += 60;
}

Umsebenzi we-cron_sleep ubandakanyeka ngokuthe ngqo ekwenzeni imisebenzi, ukubiza i-job_runqueue (bala kwaye uqhube imisebenzi) kwaye do_command (sebenzisa umsebenzi ngamnye) imisebenzi. Umsebenzi wokugqibela ufanelekile ukuphononongwa ngokubanzi.

Ukuqhuba umsebenzi

Umsebenzi we-do_command uyenziwa ngendlela elungileyo ye-Unix, oko kukuthi, yenza ifolokhwe ukwenza umsebenzi ngokungahambelaniyo. Inkqubo yomzali iyaqhubeka nokuqalisa imisebenzi, inkqubo yomntwana ilungiselela inkqubo yomsebenzi:

switch (fork()) {
case -1:
    /*не смогли выполнить fork */
    break;
case 0:
    /* дочерний процесс: на всякий случай еще раз пробуем захватить главный лок */
    acquire_daemonlock(1);
    /* переходим к формированию процесса задачи */
    child_process(e, u);
    /* по завершению дочерний процесс заканчивает работу */
    _exit(OK_EXIT);
    break;
default:
    /* родительский процесс продолжает работу */
    break;
}

Kukho ingqiqo eninzi kwi child_process: ithatha imveliso esemgangathweni kunye neemposiso zomsinga kuyo ngokwayo, ukuze uyithumele kwiposi (ukuba i MAILTO imo yendalo eguquguqukayo icacisiwe kwitafile yomsebenzi), kwaye, ekugqibeleni, ilinda engundoqo. inkqubo yokugqiba umsebenzi.

Inkqubo yomsebenzi yenziwa yenye ifolokhwe:

switch (vfork()) {
case -1:
    /* при ошибки сразу завершается работа */
    exit(ERROR_EXIT);
case 0:
    /* процесс-внук формирует новую сессию, терминал и т.д.
     */
    (void) setsid();

    /*
     * дальше многословная настройка вывода процесса, опустим для краткости
     */

    /* смена директории, пользователя и группы пользователя,
     * то есть процесс больше не суперпользовательский
     */
    setgid(e->gid);
    setuid(e->uid);
    chdir(env_get("HOME", e->envp));

    /* запуск самой команды
     */
    {
        /* переменная окружения SHELL указывает на интерпретатор для запуска */
        char    *shell = env_get("SHELL", e->envp);

        /* процесс запускается без передачи окружения родительского процесса,
         * то есть именно так, как описано в таблице задач пользователя  */
        execle(shell, shell, "-c", e->cmd, (char *)0, e->envp);

        /* ошибка — и процесс на запустился? завершение работы */
        perror("execl");
        _exit(ERROR_EXIT);
    }
    break;
default:
    /* сам процесс продолжает работу: ждет завершения работы и вывода */
    break;
}

Yiyo yonke into eyi-cron. Ndishiye iinkcukacha ezinomdla, umzekelo, ukubalwa kwabasebenzisi abakude, kodwa ndachaza into ephambili.

Emva kwegama

I-Cron yinkqubo emangalisayo elula kwaye eluncedo, eyenziwe ngezona zithethe zehlabathi ze-Unix. Akenzi nto ingaphezulu, kodwa ebewenza ngokumangalisayo umsebenzi wakhe amashumi eminyaka ngoku. Ukufumana ikhowudi yoguqulelo oluza noBuntu akuthathi ngaphezu kweyure, kwaye ndonwabe kakhulu! Ndiyathemba ukuba ndikwazile ukwabelana nawe ngayo.

Andazi ngawe, kodwa ndibuhlungu kancinci ukuqonda ukuba inkqubo yanamhlanje, kunye notyekelo lwayo lokuntsonkotha ngokugqithisileyo kunye nokungacaciswanga, akuzange kube lula ukwenza lula ixesha elide.

Zininzi iindlela zanamhlanje ezizezinye ze-cron: i-systemd-timers ikuvumela ukuba ulungelelanise iinkqubo ezinzima ezinokuxhomekeka, i-fcron ikuvumela ukuba ulawule ngokulula ukusetyenziswa kwezixhobo ngemisebenzi. Kodwa ngokobuqu, eyona crontab ilula yayihlala yanele kum.

Ngamafutshane, thanda i-Unix, sebenzisa iinkqubo ezilula kwaye ungalibali ukufunda i-mana yeqonga lakho!

umthombo: www.habr.com

Yongeza izimvo