I-Cron ku-Linux: umlando, ukusetshenziswa kanye nedivayisi

I-Cron ku-Linux: umlando, ukusetshenziswa kanye nedivayisi

I-classic ibhale ukuthi amahora ajabulisayo awabuki. Ngalezo zikhathi zasendle babengekho abahleli bezinhlelo noma i-Unix, kodwa namuhla abahleli bazi ngokuqinisekile: i-cron izogcina umkhondo wesikhathi esikhundleni sabo.

Izinsiza zomugqa womyalo zombili zibuthakathaka futhi ziwumsebenzi kimi. i-sed, i-awk, i-wc, i-cut nezinye izinhlelo ezindala ziqhutshwa yimibhalo kumaseva ethu nsuku zonke. Eziningi zazo ziklanywe njengemisebenzi ye-cron, umhleli osuka kuma-70s.

Isikhathi eside ngisebenzisa i-cron ngokukha phezulu, ngaphandle kokungena emininingwaneni, kodwa ngolunye usuku, lapho ngihlangabezana nephutha lapho ngisebenzisa iskripthi, nganquma ukukubheka kahle. Yavela kanje le ndatshana, ngenkathi ngiyibhala ngajwayelana nePOSIX crontab, izinketho eziyinhloko ze-cron ekusatshalalisweni kweLinux okudumile kanye nesakhiwo sezinye zazo.

Ingabe usebenzisa i-Linux futhi usebenzisa imisebenzi ye-cron? Ingabe unentshisekelo ekwakhiweni kwesicelo sohlelo ku-Unix? Bese sisendleleni!

Okuqukethwe

Umsuka wezinhlobo

Ukwenziwa ngezikhathi ezithile kwezinhlelo zabasebenzisi noma zesistimu kuyisidingo esisobala kuwo wonke amasistimu wokusebenza. Ngakho-ke, abahleli babona isidingo sezinsizakalo ezibavumela ukuthi bahlele futhi benze imisebenzi kudala.

Amasistimu wokusebenza afana ne-Unix alandelela umsuka wawo emuva kokuthi Inguqulo yesi-7 ye-Unix, eyakhiwe ngeminyaka yawo-70s wekhulunyaka eledlule e-Bell Labs, okuhlanganisa no-Ken Thompson odumile. Inguqulo yesi-7 ye-Unix iphinde yafaka i-cron, isevisi yokusebenza njalo kwemisebenzi yabasebenzisi abakhulu.

I-cron yesimanje ejwayelekile iwuhlelo olulula, kodwa i-algorithm yokusebenza yenguqulo yokuqala yayilula nakakhulu: insizakalo yayivuka kanye ngomzuzu, ifunde ithebula elinemisebenzi evela kufayela elilodwa (/etc/lib/crontab) futhi yenzelwe superuser leyo misebenzi okufanele ngabe yenziwe okwamanje.

Kamuva, izinguqulo ezithuthukisiwe zesevisi elula newusizo zanikezwa ngawo wonke amasistimu wokusebenza afana ne-Unix.

Izincazelo ezijwayelekile zefomethi ye-crontab kanye nezimiso eziyisisekelo zokusebenza kwensiza zafakwa ezingeni eliyinhloko lezinhlelo zokusebenza ezifana ne-Unix - i-POSIX - ngo-1992, futhi ngaleyo ndlela i-cron esuka ku-de facto standard yaba indinganiso ye-de jure.

Ku-1987, u-Paul Vixie, ngemva kokuhlola abasebenzisi be-Unix mayelana nezifiso zabo ze-cron, wakhulula enye inguqulo ye-daemon eyalungisa ezinye zezinkinga ze-cron yendabuko futhi yandisa i-syntax yamafayela wetafula.

Ngenguqulo yesithathu ye-Vixie cron yaqala ukuhlangabezana nezidingo ze-POSIX, ngaphezu kwalokho, uhlelo lwalunelayisensi ekhululekile, noma kunalokho lalingekho ilayisense nhlobo, ngaphandle kwezifiso eziku-README: umbhali akanikezi iziqinisekiso, igama lombhali ayikwazi ukususwa, futhi uhlelo lungathengiswa kuphela kanye nekhodi yomthombo. Lezi zidingo zivele zihambisana nemigomo yesofthiwe yamahhala eyayithola ukuduma ngaleyo minyaka, ngakho-ke okunye ukusabalalisa kwe-Linux okubalulekile okwavela ekuqaleni kwawo-90s kwathatha i-Vixie cron njengohlelo lwabo olulodwa futhi basaluthuthukisa nanamuhla.

Ikakhulukazi, i-Red Hat kanye ne-SUSE bakha imfoloko ye-Vixie cron - cronie, bese u-Debian no-Ubuntu basebenzisa uhlelo lokuqala lwe-Vixie cron enamapeshi amaningi.

Ake siqale sijwayelane ne-crontab yensiza yomsebenzisi echazwe ku-POSIX, ngemuva kwalokho sizobheka izandiso ze-syntax ezinikezwe ku-Vixie cron kanye nokusetshenziswa kwezinhlobonhlobo ze-Vixie cron ekusakazweni kweLinux okudumile. Futhi ekugcineni, i-cherry ekhekheni iwukuhlaziywa kwedivayisi ye-cron daemon.

I-POSIX crontab

Uma i-cron yasekuqaleni ihlala isebenzela i-superuser, abahleli besimanje bavame ukubhekana nemisebenzi yabasebenzisi abajwayelekile, evikeleke kakhudlwana futhi elula.

Ama-Cron ahlinzekwa njengesethi yezinhlelo ezimbili: i-cron daemon esebenza njalo kanye nensiza ye-crontab etholakala kubasebenzisi. Lokhu kokugcina kukuvumela ukuthi uhlele amathebula emisebenzi aqondene nomsebenzisi ngamunye ohlelweni, kuyilapho i-daemon yethula imisebenzi esuka kumathebula omsebenzisi nawesistimu.

В I-POSIX ejwayelekile ukuziphatha kwe-daemon akuchazwa nganoma iyiphi indlela futhi uhlelo lomsebenzisi kuphela olusemthethweni i-crontab. Ukuba khona kwezinqubo zokuqalisa imisebenzi yabasebenzisi, vele, kuyashiwo, kodwa akuchazwanga ngokuningiliziwe.

Ngokubiza insiza ye-crontab, ungenza izinto ezine: hlela ithebula lomsebenzisi kusihleli, ulayishe ithebula efayelini, ubonise ithebula lomsebenzi wamanje, futhi usule ithebula lomsebenzi. Izibonelo zendlela insiza ye-crontab esebenza ngayo:

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

Uma ufona crontab -e umhleli oshiwo kokuguquguquka kwemvelo okujwayelekile uzosetshenziswa EDITOR.

Imisebenzi ngokwayo ichazwa ngefomethi elandelayo:

# строки-комментарии игнорируются
#
# задача, выполняемая ежеминутно
* * * * * /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

Izinkambu ezinhlanu zokuqala zamarekhodi: imizuzu [1..60], amahora [0..23], izinsuku zenyanga [1..31], izinyanga [1..12], izinsuku zesonto [0. .6], lapho u-0 eyiSonto. Eyokugcina, yesithupha, inkambu ingumugqa ozokwenziwa umhumushi womyalo ojwayelekile.

Ezinkambuni ezinhlanu zokuqala, amanani angafakwa ohlwini ahlukaniswe ngokhefana:

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

Noma nge-hyphen:

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

Ukufinyelela komsebenzisi ekuhleleni umsebenzi kulawulwa ku-POSIX ngamafayela e-cron.allow kanye ne-cron.deny, afaka ohlwini abasebenzisi abanokufinyelela ku-crontab nabasebenzisi ngaphandle kokufinyelela kuhlelo, ngokulandelanayo. Izinga alilawuli indawo yalawa mafayela nganoma iyiphi indlela.

Ngokwezinga, okungenani okuguquguqukayo kwemvelo okune kufanele kudluliselwe ezinhlelweni eziqalisiwe:

  1. IKHAYA - uhla lwemibhalo lwasekhaya lomsebenzisi.
  2. LOGNAME - ukungena komsebenzisi.
  3. I-PATH yindlela lapho ungathola khona izinsiza zesistimu ezijwayelekile.
  4. SHELL — indlela eya kumyalo wotolika osetshenzisiwe.

Ngokuphawulekayo, i-POSIX ayisho lutho ngokuthi amanani alezi ziguquguqukayo avelaphi.

Umthengisi ongcono kakhulu - Vixie cron 3.0pl1

Idlozi elivamile lezinhlobonhlobo ze-cron ezidumile i-Vixie cron 3.0pl1, yethulwa ohlwini lwamakheli e-com.sources.unix ngo-1992. Sizocabangela izici eziyinhloko zale nguqulo ngokuningiliziwe.

I-Vixie cron iza ngezinhlelo ezimbili (i-cron ne-crontab). Njengokujwayelekile, i-daemon inesibopho sokufunda nokusebenzisa imisebenzi evela kuthebula lomsebenzi wesistimu kanye namathebula omsebenzi womsebenzisi ngamunye, futhi insiza ye-crontab inesibopho sokuhlela amathebula abasebenzisi.

Ithebula lomsebenzi namafayela okumisa

Ithebula lomsebenzi we-superuser litholakala ku-/etc/crontab. I-syntax yethebula lesistimu ihambisana ne-syntax ye-Vixie cron, ngaphandle kokuthi ikholomu yesithupha kuyo ikhombisa igama lomsebenzisi oqalwe ngaphansi kwakhe umsebenzi:

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

Amathebula emisebenzi yabasebenzisi abavamile atholakala ku-/var/cron/tabs/igama lomsebenzisi futhi asebenzisa i-syntax efanayo. Uma usebenzisa insiza ye-crontab njengomsebenzisi, lawa amafayela ahlelwayo.

Uhlu lwabasebenzisi abanokufinyelela ku-crontab luphethwe ku-/var/cron/allow kanye /var/cron/deny amafayela, lapho udinga nje ukufaka igama lomsebenzisi emgqeni ohlukile.

I-syntax enwetshiwe

Uma kuqhathaniswa ne-POSIX crontab, isixazululo sika-Paul Vixey siqukethe ukuguqulwa okuningana okuwusizo kakhulu ku-syntax yamathebula emisebenzi yensiza.

I-syntax yethebula entsha isiyatholakala: isibonelo, ungacacisa izinsuku zeviki noma izinyanga ngegama (Msombuluko, Lwesibili, njalonjalo):

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

Ungacacisa isinyathelo okwethulwa ngaso imisebenzi:

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

Izinyathelo nezikhawu zingaxutshwa:

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

Ezinye izindlela ezinembile zokwakheka kwe-syntax evamile ziyasekelwa (ukuqalisa kabusha, minyaka yonke, ngonyaka, nyanga zonke, masonto onke, nsuku zonke, phakathi kwamabili, ngehora):

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

Indawo yokwenza umsebenzi

I-Vixie cron ikuvumela ukuthi uguqule indawo yokusebenza kwezinhlelo zokusebenza.

Okuguquguqukayo kwemvelo USER, LOGNAME kanye ne-HOME akunikezwanga nje i-daemon, kodwa kuthathwe efayeleni. i-passwd. Ukuhluka kwe-PATH kusethelwe ku-"/usr/bin:/bin" futhi okuguquguqukayo kwe-SHELL kusethelwe ku-"/bin/sh". Amanani azo zonke izinto eziguquguqukayo ngaphandle kwe-LOGNAME angashintshwa kumathebula abasebenzisi.

Okunye okuguquguqukayo kwendawo (ikakhulukazi SHELL kanye NEKHAYA) kusetshenziswa i-cron uqobo ukwenza umsebenzi. Nakhu ukuthi ukusebenzisa i-bash esikhundleni sika-sh ojwayelekile ukwenza imisebenzi yangokwezifiso kungabukeka kanjani:

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

Ekugcineni, zonke izinto eziguquguqukayo zemvelo ezichazwe etafuleni (ezisetshenziswa yi-cron noma ezidingwa yinqubo) zizodluliselwa emsebenzini osebenzayo.

Ukuze uhlele amafayela, i-crontab isebenzisa isihleli esicaciswe kokuguquguquka kwemvelo kwe-VISUAL noma U-EDITOR. Uma indawo lapho i-crontab yayiqhutshwa khona ingenakho lokhu okuguquguqukayo, kuzobe sekusetshenziswa okuthi "/usr/ucb/vi" (i-ucb cishe iyiNyuvesi yaseCalifornia, eBerkeley).

cron ku-Debian ne-Ubuntu

Abathuthukisi be-Debian nokusatshalaliswa kokuphuma kokunye bakhululiwe inguqulo elungiswe kakhulu I-Vixie cron inguqulo 3.0pl1. Awukho umehluko ku-syntax yamafayela wetafula; kubasebenzisi yi-Vixie cron efanayo. Isici Esisha Esikhulu: Usekelo syslog, SELinux и WFP.

Izinguquko ezibonakala kancane, kodwa ezibambekayo zihlanganisa indawo yamafayela okumisa namathebula omsebenzi.

Amathebula abasebenzisi ku-Debian atholakala ku-directory /var/spool/cron/crontabs, ithebula lesistimu lisekhona - ku/etc/crontab. Amathebula emisebenzi aqondene nephakheji ye-Debian abekwe ku-/etc/cron.d, lapho i-cron daemon iwafunda khona ngokuzenzakalelayo. Ukulawulwa kokufinyelela komsebenzisi kulawulwa amafayela /etc/cron.allow kanye /etc/cron.deny.

Igobolondo elizenzakalelayo lisengu-/bin/sh, okuthi ku-Debian kuyigobolondo elincane elithobela i-POSIX dash, yethulwe ngaphandle kokufunda noma yikuphi ukucushwa (kwimodi yokungahlanganyeli).

I-Cron ngokwayo ezinguqulweni zakamuva ze-Debian yethulwa nge-systemd, futhi ukucushwa kokuqaliswa kungabukwa ku-/lib/systemd/system/cron.service. Akukho okukhethekile ekucushweni kwesevisi; noma yikuphi ukuphathwa komsebenzi okucashile kungenziwa ngokusebenzisa okuguquguqukayo kwendawo okumenyezelwe ngokuqondile ku-crontab yomsebenzisi ngamunye.

cronie ku-RedHat, Fedora kanye ne-CentOS

cronie - Imfoloko ye-Vixie cron version 4.1. Njengaku-Debian, i-syntax ayishintshile, kodwa ukusekelwa kwe-PAM ne-SELinux, ukusebenza ngeqoqo, ukulandelela amafayela usebenzisa i- inotify nezinye izici zengeziwe.

Ukucushwa okuzenzakalelayo kusezindaweni ezijwayelekile: ithebula lesistimu liku-/etc/crontab, amaphakheji abeka amatafula awo ku-/etc/cron.d, amatafula abasebenzisi angena ku-/var/spool/cron/crontabs.

I-daemon isebenza ngaphansi kokulawulwa kwe-systemd, ukucushwa kwesevisi kungu-/lib/systemd/system/crond.service.

Ekusakazweni okufana ne-Red Hat, /bin/sh isetshenziswa ngokuzenzakalelayo ekuqaleni, okuyi-bash evamile. Kumele kuqashelwe ukuthi uma usebenzisa imisebenzi ye-cron nge-/bin/sh, igobolondo le-bash liqala kumodi ehambisana ne-POSIX futhi alifundi noma yikuphi ukucushwa okwengeziwe, okusebenzayo kumodi engahlanganyeli.

cronie ku-SLES kanye ne-openSUSE

Ukusabalalisa kwesiJalimane i-SLES kanye nokuphuma kokuphuma kwayo ku-openSUSE kusebenzisa i-cronie efanayo. I-daemon lapha iphinde yethulwe ngaphansi kwe-systemd, ukucushwa kwesevisi kutholakala ku-/usr/lib/systemd/system/cron.service. Ukucushwa: /etc/crontab, /etc/cron.d, /var/spool/cron/tabs. /bin/sh iyi-bash efanayo esebenza kumodi yokungahlanganyeli ehambisana ne-POSIX.

Idivayisi ye-Vixie cron

Inzalo yesimanje ye-cron ayizange ishintshe kakhulu uma iqhathaniswa ne-Vixie cron, kodwa isathole izici ezintsha ezingadingeki ukuze kuqondwe izimiso zohlelo. Eziningi zalezi zandiso aziklanywe kahle futhi ziyayidida ikhodi. Ikhodi yomthombo wokuqala we-cron ka-Paul Vixey kuyajabulisa ukuyifunda.

Ngakho-ke, nginqume ukuhlaziya idivayisi ye-cron ngisebenzisa isibonelo sohlelo lwe-cron oluvamile kuwo womabili amagatsha okuthuthukiswa - Vixie cron 3.0pl1. Ngizokwenza izibonelo zibe lula ngokususa ama-ifdef enza kube nzima ukufunda nokukhipha imininingwane emincane.

Umsebenzi wedemoni ungahlukaniswa izigaba eziningana:

  1. Iqalisa uhlelo.
  2. Ukuqoqa nokubuyekeza uhlu lwemisebenzi ezoqhutshwa.
  3. I-Main cron loop isebenza.
  4. Qala umsebenzi.

Ake sizibuke ngokulandelana kwazo.

Ukuqalisa

Uma kuqalwa, ngemva kokuhlola ama-agumenti enqubo, i-cron ifaka izibambi zesignali ze-SIGCHLD ne-SIGHUP. Eyokuqala yenza ukufakwa kwelogi mayelana nokunqanyulwa kwenqubo yengane, eyesibili ivala isichazi sefayela lefayela lokungena:

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

I-cron daemon ihlale isebenza yodwa ohlelweni, kuphela njenge-superuser futhi isuka kumkhombandlela we-cron oyinhloko. Izingcingo ezilandelayo zidala ifayela lokukhiya nge-PID yenqubo ye-daemon, qiniseka ukuthi umsebenzisi ulungile futhi uguqule uhla lwemibhalo lwamanje lube oluyinhloko:

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

Indlela ezenzakalelayo isethiwe, ezosetshenziswa uma kuqala izinqubo:

setenv("PATH", _PATH_DEFPATH, 1);

Bese inqubo “ibizwa ngokuthi i-daemonized”: idala ikhophi yengane yenqubo ngokubiza imfoloko kanye neseshini entsha kunqubo yengane (ibiza setsithi). Inqubo yomzali ayisadingeki, futhi iyaphuma:

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

Ukunqanyulwa kwenqubo yomzali kukhulula ukukhiya efayeleni lokukhiya. Ngaphezu kwalokho, kuyadingeka ukuthi ubuyekeze i-PID efayelini uye enganeni. Ngemuva kwalokhu, i-database yemisebenzi igcwaliswa:

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

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

Bese i-cron iqhubekela kumjikelezo womsebenzi oyinhloko. Kodwa ngaphambi kwalokho, kufanelekile ukubheka ukulayisha uhlu lwemisebenzi.

Ukuqoqa nokubuyekeza uhlu lwemisebenzi

Umsebenzi we-load_database unesibopho sokulayisha uhlu lwemisebenzi. Ihlola i-crontab yesistimu eyinhloko kanye nohla lwemibhalo olunamafayela omsebenzisi. Uma amafayela nohla lwemibhalo kungashintshile, uhlu lwemisebenzi alufundwa kabusha. Uma kungenjalo, uhlu olusha lwemisebenzi luqala ukwakheka.

Ilayisha ifayela lesistimu elinamagama akhethekile wefayela namathebula:

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

Ilayisha amathebula abasebenzisi ku-loop:

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);
}

Ngemva kwalokho i-database endala ithathelwa indawo entsha.

Ezibonelweni ezingenhla, ikholi yomsebenzi we-process_crontab iqinisekisa ukuthi umsebenzisi ofana negama lefayela letafula ukhona (ngaphandle uma kuwumsebenzisi omkhulu) bese ebiza i-load_user. Owokugcina usuvele ufunda ifayela ngokwalo umugqa ngomugqa:

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;
    }
}

Lapha, kuphakathi kokuthi okuguquguqukayo kwemvelo kuyasethwa (imigqa yefomu VAR=value) kusetshenziswa imisebenzi load_env / env_set, noma incazelo yomsebenzi ifundwa (* * * * * /path/to/exec) kusetshenziswa umsebenzi wokulayisha_ukungena.

Ibhizinisi elingenayo elibuyayo load_entry liwumsebenzi wethu, obekwe ohlwini olujwayelekile lwemisebenzi. Umsebenzi ngokwawo wenza ukuhlukaniswa kwe-verbose kwefomethi yesikhathi, kodwa sinentshisekelo enkulu ekwakhekeni kwezinto eziguquguqukayo zendawo kanye nemingcele yokuqalisa umsebenzi:

/* пользователь и группа для запуска задачи берутся из 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);

Iluphu eyinhloko isebenza nohlu lwamanje lwemisebenzi.

Iluphu eyinhloko

I-cron yasekuqaleni evela ku-Version 7 Unix isebenze kalula: iphinde yafunda ukucushwa ku-loop, yethula imisebenzi yomzuzu wamanje njengomsebenzisi omkhulu, futhi yalala kwaze kwaba kuqale umzuzu olandelayo. Le ndlela elula emshinini omdala idinga izinsiza eziningi kakhulu.

Enye inguqulo yahlongozwa ku-SysV, lapho i-daemon ilale khona kuze kube umzuzu oseduze lapho umsebenzi uchazwe khona, noma imizuzu engama-30. Izinsiza ezimbalwa zasetshenziswa ukuze kufundwe kabusha ukucushwa nokuhlola imisebenzi kule modi, kodwa ukuvuselela ngokushesha uhlu lwemisebenzi kwaba yinkinga.

U-Vixie cron ubuyele ekuhloleni uhlu lwemisebenzi kanye ngomzuzu, ngenhlanhla ekupheleni kweminyaka yama-80s kwase kunezinsiza eziningi kakhulu emishinini ejwayelekile ye-Unix:

/* первичная загрузка задач */
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 uhileleke ngokuqondile ekwenzeni imisebenzi, ubiza umsebenzi_runqueue (bala futhi uqhube imisebenzi) kanye nokuthi do_command (sebenzisa umsebenzi ngamunye). Umsebenzi wokugcina kufanele uhlolwe ngokuningiliziwe.

Ukwenza umsebenzi

Umsebenzi we-do_command wenziwa ngesitayela esihle se-Unix, okusho ukuthi, wenza imfoloko ukwenza umsebenzi ngendlela esynchronously. Inqubo yomzali iyaqhubeka nokuqalisa imisebenzi, inqubo yengane ilungiselela inqubo yomsebenzi:

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

Kuningi okunengqondo ku-child_process: kuthatha okukhiphayo okujwayelekile kanye nokugeleza kwephutha kuyona, ukuze bese uyithumela ku-imeyili (uma i-MAILTO imvelo eguquguqukayo icaciswe kuthebula lomsebenzi), futhi, ekugcineni, ilinda okuyinhloko. inqubo yomsebenzi ozoqedwa.

Inqubo yomsebenzi yenziwa ngenye imfoloko:

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;
}

Yilokho kuphela okuyi-cron. Ngishiye imininingwane ethokozisayo, ngokwesibonelo, ukubalwa kwabasebenzisi abakude, kodwa ngichaze into esemqoka.

I-Afterword

I-Cron iwuhlelo olulula ngokumangazayo noluwusizo, olwenziwe ngamasiko angcono kakhulu omhlaba we-Unix. Akenzi lutho olwengeziwe, kodwa usewenza kahle umsebenzi wakhe amashumi eminyaka ambalwa manje. Ukuthola ikhodi yenguqulo eza no-Ubuntu akuthathanga ngaphezu kwehora, futhi ngijabule kakhulu! Ngethemba ukuthi ngikwazile ukukwabelana nawe.

Angazi ngawe, kodwa kuyangidabukisa ukubona ukuthi ukuhlela kwesimanje, nokuthambekela kwakho ekwenzeni inkimbinkimbi kakhulu futhi kungabonakali, akuzange kube lula ukwenza lula okunjalo isikhathi eside.

Kunezindlela eziningi zesimanje zokusebenzisa i-cron: ama-systemd-timers akuvumela ukuthi uhlele izinhlelo eziyinkimbinkimbi ezinokuncika, i-fcron ikuvumela ukuthi ulawule ngokuguquguqukayo ukusetshenziswa kwensiza ngemisebenzi. Kodwa ngokwami, i-crontab elula yayihlala yanele kimi.

Ngamafuphi, thanda i-Unix, sebenzisa izinhlelo ezilula futhi ungakhohlwa ukufunda i-mana yesikhulumi sakho!

Source: www.habr.com

Engeza amazwana