Cron fil-Linux: storja, użu u apparat

Cron fil-Linux: storja, użu u apparat

Il-klassika kiteb li sigħat kuntenti ma jarawx. F'dawk iż-żminijiet selvaġġi la kien hemm programmaturi u lanqas Unix, iżda llum il-programmaturi jafu żgur: cron se jżomm kont tal-ħin minflokhom.

L-utilitajiet tal-linja tal-kmand huma kemm dgħjufija kif ukoll xogħol għalija. sed, awk, wc, cut u programmi qodma oħra huma mmexxija minn skripts fuq is-servers tagħna kuljum. Ħafna minnhom huma ddisinjati bħala kompiti għal cron, scheduler oriġinarjament mis-snin 70.

Għal żmien twil użajt il-cron b'mod superfiċjali, mingħajr ma dħalt fid-dettalji, iżda xi darba, meta ltqajt ma' żball meta nmexxi script, iddeċidejt li nħares sewwa. Hekk deher dan l-artiklu, waqt li ktibtu sirt familjari mal-POSIX crontab, l-għażliet ewlenin tal-cron fid-distribuzzjonijiet popolari tal-Linux u l-istruttura ta’ xi wħud minnhom.

Qed tuża Linux u tmexxi kompiti cron? Inti interessat fl-arkitettura tal-applikazzjoni tas-sistema f'Unix? Imbagħad aħna qed fi triqitna!

Kontenut

Oriġini ta 'speċi

L-eżekuzzjoni perjodika tal-programmi tal-utent jew tas-sistema hija ħtieġa ovvja fis-sistemi operattivi kollha. Għalhekk, il-programmaturi rrealizzaw il-ħtieġa għal servizzi li jippermettulhom jippjanaw u jeżegwixxu kompiti ċentralment żmien twil ilu.

Is-sistemi operattivi bħal Unix jittraċċaw l-oriġini tagħhom lura għall-Verżjoni 7 Unix, żviluppata fis-snin 70 tas-seklu li għadda fil-Bell Labs, inkluż mill-famuż Ken Thompson. Verżjoni 7 Unix inkludiet ukoll cron, servizz għat-tmexxija regolari tal-kompiti tas-superuser.

Cron modern tipiku huwa programm sempliċi, iżda l-algoritmu operattiv tal-verżjoni oriġinali kien saħansitra aktar sempliċi: is-servizz qam darba fil-minuta, aqra tabella b'kompiti minn fajl wieħed (/etc/lib/crontab) u wettaq għall- superuser dawk il-kompiti li kellhom jitwettqu fil-mument attwali.

Sussegwentement, verżjonijiet imtejba tas-servizz sempliċi u utli ġew fornuti bis-sistemi operattivi kollha bħal Unix.

Deskrizzjonijiet ġeneralizzati tal-format crontab u l-prinċipji bażiċi tal-operat tal-utilità ġew inklużi fl-istandard ewlieni ta 'sistemi operattivi Unix-like - POSIX - fl-1992, u għalhekk cron minn standard de facto sar standard de jure.

Fl-1987, Paul Vixie, wara li stħarreġ lill-utenti Unix dwar ix-xewqat tagħhom għal cron, ħareġ verżjoni oħra tad-daemon li kkoreġiet xi wħud mill-problemi ta 'cron tradizzjonali u espandiet is-sintassi tal-fajls tat-tabella.

Mit-tielet verżjoni ta 'Vixie cron bdiet tissodisfa r-rekwiżiti POSIX, barra minn hekk, il-programm kellu liċenzja liberali, jew aħjar ma kien hemm l-ebda liċenzja, ħlief għax-xewqat fil-README: l-awtur ma jagħtix garanziji, l-isem tal-awtur ma jistax jitħassar, u l-programm jista 'jinbiegħ biss flimkien mal-kodiċi tas-sors. Dawn ir-rekwiżiti rriżultaw li huma kompatibbli mal-prinċipji ta’ softwer b’xejn li kien qed jikseb popolarità f’dawk is-snin, għalhekk xi wħud mid-distribuzzjonijiet ewlenin tal-Linux li dehru fil-bidu tas-snin 90 ħadu lil Vixie cron bħala waħda tas-sistema tagħhom u għadhom qed jiżviluppawha llum.

B'mod partikolari, Red Hat u SUSE jiżviluppaw furketta ta 'Vixie cron - cronie, u Debian u Ubuntu jużaw l-edizzjoni oriġinali ta' Vixie cron b'ħafna garżi.

Ejja l-ewwel niffamiljarizzaw ruħhom mal-crontab tal-utilità tal-utent deskritta f'POSIX, u wara se nħarsu lejn l-estensjonijiet tas-sintassi pprovduti f'Vixie cron u l-użu ta 'varjazzjonijiet ta' Vixie cron fid-distribuzzjonijiet popolari tal-Linux. U fl-aħħarnett, iċ-ċirasa fuq il-kejk hija l-analiżi tal-apparat cron daemon.

POSIX crontab

Jekk il-cron oriġinali dejjem ħadem għas-superuser, l-iskedaturi moderni ħafna drabi jittrattaw ħidmiet ta 'utenti ordinarji, li huwa aktar sigur u konvenjenti.

Crons huma fornuti bħala sett ta 'żewġ programmi: id-daemon cron li qed jaħdem kontinwament u l-utilità crontab disponibbli għall-utenti. Dan tal-aħħar jippermettilek teditja tabelli tal-kompiti speċifiċi għal kull utent fis-sistema, filwaqt li d-daemon iniedi kompiti minn tabelli tal-utent u tas-sistema.

В Standard POSIX l-imġieba tad-daemon mhix deskritta bl-ebda mod u l-programm tal-utent biss huwa formalizzat crontab. L-eżistenza ta 'mekkaniżmi għat-tnedija tal-kompiti tal-utent hija, ovvjament, implikata, iżda mhux deskritta fid-dettall.

Billi ċċempel l-utilità tal-crontab, tista 'tagħmel erba' affarijiet: editja t-tabella tal-kompitu tal-utent fl-editur, tagħbija t-tabella minn fajl, turi t-tabella tal-kompitu attwali, u ċara t-tabella tal-kompiti. Eżempji ta' kif taħdem l-utilità crontab:

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

Meta tissejjaħ crontab -e se jintuża l-editur speċifikat fil-varjabbli ambjentali standard EDITOR.

Il-kompiti nfushom huma deskritti fil-format li ġej:

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

L-ewwel ħames oqsma tar-rekords: minuti [1..60], sigħat [0..23], ġranet tax-xahar [1..31], xhur [1..12], ġranet tal-ġimgħa [0. .6], fejn 0 huwa l-Ħadd. L-aħħar, is-sitt, qasam huwa linja li se tiġi esegwita mill-interpretu tal-kmand standard.

Fl-ewwel ħames oqsma, il-valuri jistgħu jiġu elenkati separati b'virgoli:

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

Jew b'sing:

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

L-aċċess tal-utent għall-iskedar tal-kompiti huwa regolat f'POSIX mill-fajls cron.allow u cron.deny, li jelenkaw utenti b'aċċess għal crontab u utenti mingħajr aċċess għall-programm, rispettivament. L-istandard ma jirregola l-post ta 'dawn il-fajls bl-ebda mod.

Skont l-istandard, mill-inqas erba' varjabbli ambjentali għandhom jiġu mgħoddija lill-programmi mnedija:

  1. HOME - direttorju tad-dar tal-utent.
  2. LOGNAME — login tal-utent.
  3. PATH hija t-triq fejn tista 'ssib utilitajiet tas-sistema standard.
  4. SHELL — mogħdija għall-interpretu tal-kmand użat.

Notevolment, POSIX ma tgħid xejn dwar minn fejn jiġu l-valuri għal dawn il-varjabbli.

Best seller - Vixie cron 3.0pl1

L-antenat komuni tal-varjanti cron popolari huwa Vixie cron 3.0pl1, introdott fil-lista tal-posta comp.sources.unix fl-1992. Aħna se nikkunsidraw il-karatteristiċi ewlenin ta 'din il-verżjoni f'aktar dettall.

Vixie cron jiġi f'żewġ programmi (cron u crontab). Bħas-soltu, id-daemon huwa responsabbli għall-qari u t-tmexxija tal-kompiti mit-tabelli tal-kompiti tas-sistema u t-tabelli tal-kompiti tal-utent individwali, u l-utilità crontab hija responsabbli għall-editjar tat-tabelli tal-utent.

Tabella tal-kompiti u fajls tal-konfigurazzjoni

It-tabella tal-kompitu tas-superuser tinsab f'/etc/crontab. Is-sintassi tat-tabella tas-sistema tikkorrispondi mas-sintassi ta' Vixie cron, bl-eċċezzjoni li s-sitt kolonna fiha tindika l-isem tal-utent li f'ismu jitnieda l-kompitu:

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

It-tabelli tal-kompiti tal-utent regolari jinsabu f'/var/cron/tabs/username u jużaw l-istess sintassi. Meta tħaddem l-utilità crontab bħala utent, dawn huma l-fajls li huma editjati.

Il-listi ta' utenti b'aċċess għal crontab huma ġestiti fil-fajls /var/cron/allow u /var/cron/deny, fejn għandek bżonn biss li ddaħħal l-isem tal-utent f'linja separata.

Sintassi estiża

Meta mqabbel ma 'POSIX crontab, is-soluzzjoni ta' Paul Vixey fiha diversi modifiki utli ħafna għas-sintassi tat-tabelli tal-kompiti tal-utilità.

Sintassi ta' tabella ġdida saret disponibbli: pereżempju, tista' tispeċifika ġranet tal-ġimgħa jew xhur b'isem (Tne, Tlieta, eċċ):

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

Tista' tispeċifika l-pass li permezz tiegħu jiġu varati l-kompiti:

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

Passi u intervalli jistgħu jitħalltu:

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

Huma appoġġjati alternattivi intuwittivi għas-sintassi tas-soltu (reboot, kull sena, kull sena, kull xahar, kull ġimgħa, kuljum, nofs il-lejl, kull siegħa):

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

Ambjent ta 'eżekuzzjoni tal-kompitu

Vixie cron jippermettilek tibdel l-ambjent tat-tħaddim tal-applikazzjonijiet.

Il-varjabbli ambjentali USER, LOGNAME u HOME mhumiex sempliċement ipprovduti mid-daemon, iżda jittieħdu minn fajl passwd. Il-varjabbli PATH hija ssettjata għal "/usr/bin:/bin" u l-varjabbli SHELL hija ssettjata għal "/bin/sh". Il-valuri tal-varjabbli kollha ħlief LOGNAME jistgħu jinbidlu fit-tabelli tal-utenti.

Xi varjabbli ambjentali (l-aktar SHELL u HOME) jintużaw minn cron innifsu biex imexxi l-kompitu. Hawn kif tista' tidher l-użu ta' bash minflok sh standard biex imexxu kompiti tad-dwana:

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

Fl-aħħar mill-aħħar, il-varjabbli ambjentali kollha definiti fit-tabella (użati minn cron jew meħtieġa mill-proċess) se jiġu mgħoddija lill-kompitu li qed jaħdem.

Biex teditja l-fajls, crontab juża l-editur speċifikat fil-varjabbli tal-ambjent VISUAL jew EDITOR. Jekk l-ambjent fejn tmexxi crontab ma jkollux dawn il-varjabbli definiti, allura tintuża "/usr/ucb/vi" (ucb hija probabbilment l-Università ta' Kalifornja, Berkeley).

cron fuq Debian u Ubuntu

L-iżviluppaturi ta 'Debian u distribuzzjonijiet derivattivi ħarġu verżjoni modifikata ħafna Vixie cron verżjoni 3.0pl1. M'hemm l-ebda differenzi fis-sintassi tal-fajls tat-tabella għall-utenti huwa l-istess Vixie cron; L-akbar Karatteristika ġdida: Appoġġ sistema, SELinux и PAM.

Tibdiliet inqas notevoli, iżda tanġibbli jinkludu l-post tal-fajls tal-konfigurazzjoni u t-tabelli tal-kompiti.

It-tabelli tal-utenti f'Debian jinsabu fid-direttorju /var/spool/cron/crontabs, it-tabella tas-sistema għadha hemm - f'/etc/crontab. It-tabelli tal-kompiti speċifiċi għall-pakkett Debian jitqiegħdu f'/etc/cron.d, minn fejn id-daemon cron jaqrahom awtomatikament. Il-kontroll tal-aċċess tal-utent huwa kkontrollat ​​mill-fajls /etc/cron.allow u /etc/cron.deny.

Il-qoxra default għadha /bin/sh, li f'Debian hija qoxra żgħira konformi ma' POSIX sing, imnedija mingħajr ma taqra l-ebda konfigurazzjoni (f'modalità mhux interattiva).

Cron innifsu fl-aħħar verżjonijiet ta 'Debian huwa mniedi permezz ta' systemd, u l-konfigurazzjoni tat-tnedija tista 'tara f'/lib/systemd/system/cron.service. M'hemm xejn speċjali fil-konfigurazzjoni tas-servizz; kwalunkwe ġestjoni tal-kompiti aktar sottili tista 'ssir permezz ta' varjabbli ambjentali ddikjarati direttament fil-crontab ta 'kull utent.

cronie fuq RedHat, Fedora u CentOS

crony — furketta ta' Vixie cron verżjoni 4.1. Bħal f'Debian, is-sintassi ma nbidlitx, iżda ġie miżjud appoġġ għal PAM u SELinux, li jaħdmu fi cluster, li jsegwu fajls bl-użu ta' inotify u karatteristiċi oħra.

Il-konfigurazzjoni default tinsab fil-postijiet tas-soltu: it-tabella tas-sistema tinsab f'/etc/crontab, il-pakketti jpoġġu t-tabelli tagħhom f'/etc/cron.d, it-tabelli tal-utenti jmorru f'/var/spool/cron/crontabs.

Id-daemon jaħdem taħt kontroll systemd, il-konfigurazzjoni tas-servizz hija /lib/systemd/system/crond.service.

Fuq distribuzzjonijiet bħal Red Hat, /bin/sh jintuża awtomatikament fl-istartjar, li huwa l-bash standard. Għandu jiġi nnutat li meta tħaddem impjiegi cron permezz ta '/bin/sh, il-qoxra tal-bash tibda fil-modalità konformi ma' POSIX u ma taqra l-ebda konfigurazzjoni addizzjonali, taħdem f'modalità mhux interattiva.

cronie fl-SLES u openSUSE

Id-distribuzzjoni Ġermaniża SLES u d-derivattiv tagħha openSUSE jużaw l-istess cronie. Id-daemon hawnhekk huwa mniedi wkoll taħt systemd, il-konfigurazzjoni tas-servizz tinsab f'/usr/lib/systemd/system/cron.service. Konfigurazzjoni: /etc/crontab, /etc/cron.d, /var/spool/cron/tabs. /bin/sh huwa l-istess bash li jaħdem fil-modalità mhux interattiva konformi mal-POSIX.

Apparat cron Vixie

Dixxendenti moderni ta 'cron ma nbidlux radikalment meta mqabbla ma' Vixie cron, iżda xorta kisbu karatteristiċi ġodda li mhumiex meħtieġa biex jifhmu l-prinċipji tal-programm. Ħafna minn dawn l-estensjonijiet huma ddisinjati ħażin u jħawdu l-kodiċi. Il-kodiċi tas-sors cron oriġinali minn Paul Vixey huwa ta 'pjaċir li taqra.

Għalhekk, iddeċidejt li tanalizza l-apparat cron billi tuża l-eżempju ta 'programm cron komuni għaż-żewġ fergħat tal-iżvilupp - Vixie cron 3.0pl1. Se nissimplifika l-eżempji billi nneħħi l-ifdefs li jikkomplikaw il-qari u nħalli barra dettalji minuri.

Ix-xogħol tad-dimonju jista 'jinqasam f'diversi stadji:

  1. Inizjalizzazzjoni tal-programm.
  2. Il-ġbir u l-aġġornament tal-lista tal-kompiti li għandhom imexxu.
  3. Cron loop prinċipali taħdem.
  4. Ibda kompitu.

Ejja nħarsu lejhom fl-ordni.

Inizjalizzazzjoni

Meta jinbeda, wara li jiċċekkja l-argumenti tal-proċess, cron jinstalla l-immaniġġjar tas-sinjali SIGCHLD u SIGHUP. L-ewwel wieħed jagħmel dħul fil-log dwar it-terminazzjoni tal-proċess tat-tfal, it-tieni wieħed jagħlaq id-deskrittur tal-fajl tal-fajl log:

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

Il-cron daemon dejjem jaħdem waħdu fis-sistema, biss bħala superuser u mid-direttorju cron prinċipali. Is-sejħiet li ġejjin joħolqu fajl lock bil-PID tal-proċess daemon, kun żgur li l-utent huwa korrett u ibdel id-direttorju attwali għal dak prinċipali:

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

Il-mogħdija default hija stabbilita, li se tintuża meta jibdew il-proċessi:

setenv("PATH", _PATH_DEFPATH, 1);

Imbagħad il-proċess huwa "demonizzat": joħloq kopja tifel tal-proċess billi ssejjaħ fork u sessjoni ġdida fil-proċess tifel (sejħa setsid). Il-proċess ġenitur m'għadux meħtieġ, u joħroġ:

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

It-tmiem tal-proċess ġenitur jirrilaxxa l-lock fuq il-fajl tal-lock. Barra minn hekk, huwa meħtieġ li taġġorna l-PID fil-fajl lit-tifel. Wara dan, id-database tal-kompiti timtela:

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

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

Imbagħad cron jimxi fuq iċ-ċiklu tax-xogħol prinċipali. Iżda qabel dan, ta 'min jagħti ħarsa lejn it-tagħbija tal-lista tal-kompiti.

Il-ġbir u l-aġġornament tal-lista tal-kompiti

Il-funzjoni load_database hija responsabbli għat-tagħbija tal-lista tal-kompiti. Jiċċekkja s-sistema prinċipali crontab u d-direttorju bil-fajls tal-utent. Jekk il-fajls u d-direttorju ma nbidlux, il-lista tal-kompiti ma terġax tinqara. Inkella, tibda tifforma lista ġdida ta 'kompiti.

Tagħbija ta' fajl tas-sistema b'ismijiet speċjali ta' fajls u tabelli:

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

Tagħbija tat-tabelli tal-utenti f'linja:

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

Wara dan id-database l-antika tinbidel b'waħda ġdida.

Fl-eżempji ta 'hawn fuq, is-sejħa tal-funzjoni process_crontab tivverifika li jeżisti utent li jaqbel mal-isem tal-fajl tat-tabella (sakemm ma jkunx superuser) u mbagħad isejjaħ load_user. Dan tal-aħħar diġà jaqra l-fajl innifsu linja b'linja:

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

Hawnhekk, jew il-varjabbli tal-ambjent hija ssettjata (linji tal-forma VAR=value) bl-użu tal-funzjonijiet load_env / env_set, jew id-deskrizzjoni tal-kompitu tinqara (* * * * * /path/to/exec) bl-użu tal-funzjoni load_entry.

L-entità tad-dħul li load_entry tirritorna hija l-kompitu tagħna, li titqiegħed fil-lista ġenerali tal-kompiti. Il-funzjoni nnifisha twettaq parsing verbose tal-format tal-ħin, iżda aħna aktar interessati fil-formazzjoni ta 'varjabbli ambjentali u parametri tat-tnedija tal-kompiti:

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

Il-linja prinċipali taħdem mal-lista attwali tal-kompiti.

Loop prinċipali

Il-cron oriġinali mill-Verżjoni 7 Unix ħadem pjuttost sempliċi: reġa' aqra l-konfigurazzjoni f'linja, nieda l-kompiti tal-minuta attwali bħala superuser, u raqad sal-bidu tal-minuta li jmiss. Dan l-approċċ sempliċi fuq magni anzjani kien jeħtieġ wisq riżorsi.

Ġiet proposta verżjoni alternattiva f'SysV, li fiha d-daemon mar jorqod jew sal-eqreb minuta li għaliha ġie definit il-kompitu, jew għal 30 minuta. Inqas riżorsi ġew ikkunsmati għall-qari mill-ġdid tal-konfigurazzjoni u l-iċċekkjar tal-kompiti f'dan il-mod, iżda l-aġġornament malajr tal-lista tal-kompiti sar inkonvenjenti.

Vixie cron irritorna biex jiċċekkja l-listi tal-kompiti darba fil-minuta, fortunatament sa tmiem is-snin 80 kien hemm ħafna aktar riżorsi fuq magni standard 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;
}

Il-funzjoni cron_sleep hija direttament involuta fl-eżekuzzjoni tal-kompiti, issejjaħ il-funzjonijiet job_runqueue (enumera u mexxi l-kompiti) u do_command (mexxi kull kompitu individwali). L-aħħar funzjoni ta 'min jeżamina f'aktar dettall.

Tmexxi kompitu

Il-funzjoni do_command hija eżegwita fi stil Unix tajjeb, jiġifieri, tagħmel furketta biex twettaq il-kompitu b'mod asinkroniku. Il-proċess ġenitur ikompli jniedi l-kompiti, il-proċess tat-tfal jipprepara l-proċess tal-kompitu:

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

Hemm ħafna loġika f'child_process: jaċċetta output standard u flussi ta' żbalji, imbagħad jibgħathom lill-posta (jekk il-varjabbli tal-ambjent MAILTO hija speċifikata fit-tabella tal-kompitu), u, finalment, tistenna l-proċess ewlieni tal-kompitu biex kompluta.

Il-proċess tal-kompitu huwa ffurmat minn furketta oħra:

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

Bażikament dak kollu huwa cron. Ħallat barra xi dettalji interessanti, pereżempju, kont ta 'utenti remoti, iżda ddeskriviejt il-ħaġa prinċipali.

Wara kelma

Cron huwa programm sorprendentement sempliċi u utli, magħmul fl-aqwa tradizzjonijiet tad-dinja Unix. Hija ma tagħmel xejn żejjed, iżda issa ilha tagħmel xogħolha mill-isbaħ għal bosta deċennji. Li ngħaddi l-kodiċi għall-verżjoni li tiġi ma 'Ubuntu ma ħaditx aktar minn siegħa, u ħadt gost ħafna! Nispera li stajt naqsamha miegħek.

Ma nafx dwarek, imma jien ftit imdejjaq nirrealizza li l-programmazzjoni moderna, bit-tendenza tagħha li tikkomplika żżejjed u wisq astratta, ilha ma twassalx għal sempliċità bħal din.

Hemm ħafna alternattivi moderni għal cron: systemd-timers jippermettulek torganizza sistemi kumplessi b'dipendenzi, fcron jippermettilek tirregola b'mod aktar flessibbli l-konsum tar-riżorsi skont il-kompiti. Imma personalment, l-aktar sempliċi crontab kien dejjem biżżejjed għalija.

Fil-qosor, ħobb Unix, uża programmi sempliċi u tinsiex taqra l-mana għall-pjattaforma tiegħek!

Sors: www.habr.com

Żid kumment