Cron ann an Linux: eachdraidh, cleachdadh agus inneal

Cron ann an Linux: eachdraidh, cleachdadh agus inneal

Sgrìobh an clasaig nach bi uairean sona a’ coimhead. Anns na h-amannan fiadhaich sin cha robh prògramadairean no Unix ann, ach an-diugh tha fios aig prògramadairean gu cinnteach: cumaidh cron sùil air an ùine nan àite.

Tha goireasan loidhne-àithne an dà chuid na laigse agus na obair chruaidh dhomh. Tha sed, awk, wc, cut agus seann phrògraman eile gan ruith le sgriobtaichean air na frithealaichean againn a h-uile latha. Tha mòran dhiubh air an dealbhadh mar ghnìomhan airson cron, clàr-ama bho thùs bho na 70an.

Airson ùine mhòr chleachd mi cron gu h-àrd, gun a bhith a 'dol a-steach gu mion-fhiosrachadh, ach aon latha, nuair a thachair mi ri mearachd nuair a bha mi a' ruith sgriobt, chuir mi romhpa coimhead a-steach gu mionaideach. Seo mar a nochd an artaigil seo, fhad ‘s a bha mi ga sgrìobhadh dh’ fhàs mi eòlach air POSIX crontab, na prìomh roghainnean cron ann an sgaoilidhean Linux mòr-chòrdte agus structar cuid dhiubh.

A bheil thu a’ cleachdadh Linux agus a’ ruith gnìomhan cron? A bheil ùidh agad ann an ailtireachd tagradh siostam ann an Unix? An uairsin tha sinn air ar slighe!

Clàr-innse

Tùs nan gnèithean

Tha e follaiseach gu bheil coileanadh prògraman luchd-cleachdaidh no siostam bho àm gu àm riatanach anns a h-uile siostam obrachaidh. Mar sin, thuig luchd-prògramaidh gu robh feum air seirbheisean a leigeas leotha gnìomhan a phlanadh agus a choileanadh o chionn fhada.

Bidh siostaman obrachaidh coltach ri Unix a’ leantainn an tùsan air ais gu Tionndadh 7 Unix, a chaidh a leasachadh anns na 70n den linn mu dheireadh aig Bell Labs, a’ toirt a-steach an neach ainmeil Ken Thompson. Bha dreach 7 Unix cuideachd a’ toirt a-steach cron, seirbheis airson gnìomhan superuser a ruith gu cunbhalach.

Is e prògram sìmplidh a th’ ann an cron ùr-nodha àbhaisteach, ach bha algorithm obrachaidh an dreach tùsail eadhon nas sìmplidh: dhùisg an t-seirbheis uair sa mhionaid, leugh clàr le gnìomhan bho aon fhaidhle (/etc/lib/crontab) agus rinn e airson an superuser na gnìomhan sin a bu chòir a bhith air an coileanadh aig an àm seo.

Às deidh sin, chaidh dreachan leasaichte den t-seirbheis shìmplidh agus fheumail a thoirt seachad leis a h-uile siostam obrachaidh coltach ri Unix.

Bha tuairisgeulan coitcheann air cruth crontab agus prionnsapalan bunaiteach obrachadh a’ ghoireas air an toirt a-steach don phrìomh ìre de shiostaman obrachaidh coltach ri Unix - POSIX - ann an 1992, agus mar sin thàinig cron bho inbhe de facto gu bhith na inbhe de jure.

Ann an 1987, chuir Paul Vixie, an dèidh sgrùdadh a dhèanamh air luchd-cleachdaidh Unix mu na miannan aca airson cron, dreach eile den daemon a cheartaich cuid de dhuilgheadasan cron traidiseanta agus leudaich e co-chòrdadh faidhlichean bùird.

Ron treas dreach de Vixie cron thòisich e a 'coinneachadh ri riatanasan POSIX, a bharrachd air an sin, bha cead libearalach aig a' phrògram, no an àite sin cha robh cead sam bith ann, ach a-mhàin na miannan anns an README: chan eil an t-ùghdar a 'toirt seachad barantas, ainm an ùghdair chan urrainnear a sguabadh às, agus chan urrainnear am prògram a reic ach còmhla ri còd stòr. Thionndaidh na riatanasan sin gu bhith co-chòrdail ri prionnsapalan bathar-bog an-asgaidh a bha a ’fàs mòr-chòrdte anns na bliadhnaichean sin, agus mar sin ghabh cuid de na prìomh sgaoilidhean Linux a nochd tràth anns na 90n Vixie cron mar an siostam aca agus tha iad fhathast ga leasachadh an-diugh.

Gu sònraichte, bidh Red Hat agus SUSE a’ leasachadh forc de Vixie cron - cronie, agus bidh Debian agus Ubuntu a’ cleachdadh an deasachadh tùsail de Vixie cron le mòran phìosan.

Nach faigh sinn eòlas an-toiseach air crontab goireas neach-cleachdaidh a chaidh a mhìneachadh ann am POSIX, às deidh sin bheir sinn sùil air na leudachain co-chòrdalachd a chaidh a thoirt seachad ann an Vixie cron agus cleachdadh atharrachaidhean de Vixie cron ann an sgaoilidhean Linux mòr-chòrdte. Agus mu dheireadh, is e a 'cherry air a' chèic an anailis air an inneal daemon cron.

crontab POSIX

Nam biodh an cron tùsail an-còmhnaidh ag obair don superuser, bidh luchd-clàraidh an latha an-diugh gu tric a’ dèiligeadh ri gnìomhan luchd-cleachdaidh àbhaisteach, a tha nas tèarainte agus nas goireasaiche.

Tha crùn air an toirt seachad mar sheata de dhà phrògram: an daemon cron a tha a’ ruith gu cunbhalach agus an goireas crontab a tha ri fhaighinn le luchd-cleachdaidh. Leigidh an tè mu dheireadh leat clàran gnìomh a tha sònraichte do gach neach-cleachdaidh san t-siostam a dheasachadh, fhad ‘s a bhios an daemon a’ cur air bhog gnìomhan bho chlàran cleachdaiche is siostam.

В POSIX àbhaisteach chan eil giùlan an daemon air a mhìneachadh ann an dòigh sam bith agus chan eil ach am prògram cleachdaiche foirmeil crìosb. Gu dearbh, tha dòighean ann airson gnìomhan luchd-cleachdaidh a chuir air bhog, gu dearbh, ach chan eil iad air am mìneachadh gu mionaideach.

Le bhith a’ gairm goireas crontab, faodaidh tu ceithir rudan a dhèanamh: deasaich clàr gnìomh an neach-cleachdaidh anns an deasaiche, luchdaich am bòrd bho fhaidhle, seall an clàr gnìomh gnàthach, agus cuir às don chlàr gnìomh. Eisimpleirean de mar a tha goireas crontab ag obair:

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

Nuair a chaidh a ghairm crontab -e thèid an deasaiche a tha air a shònrachadh sa chaochladair àrainneachd àbhaisteach a chleachdadh EDITOR.

Tha na gnìomhan fhèin air am mìneachadh anns na cruth a leanas:

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

A’ chiad còig raointean de na clàran: mionaidean [1..60], uairean [0..23], làithean na mìos [1...31], mìosan [1..12], làithean na seachdain [0. .6], far a bheil 0 Dòmhnach. Tha an raon mu dheireadh, an t-siathamh, na loidhne a thèid a chuir gu bàs leis an eadar-theangair àithne àbhaisteach.

Anns a’ chiad còig raointean, faodar luachan a chlàradh air an sgaradh le cromagan:

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

No le tàthan:

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

Tha ruigsinneachd luchd-cleachdaidh air clàradh ghnìomhan air a riaghladh ann am POSIX leis na faidhlichean cron.allow agus cron.deny, a tha a’ liostadh luchd-cleachdaidh aig a bheil cothrom air crontab agus luchd-cleachdaidh gun chothrom air a’ phrògram, fa leth. Chan eil an inbhe a’ riaghladh suidheachadh nam faidhlichean sin ann an dòigh sam bith.

A rèir na h-ìre, feumar co-dhiù ceithir caochladairean àrainneachd a thoirt gu prògraman a chaidh a chuir air bhog:

  1. DACHAIGH - eòlaire dachaigh an neach-cleachdaidh.
  2. LOGNAME - logadh a-steach neach-cleachdaidh.
  3. Is e PATH an t-slighe far am faigh thu goireasan siostam àbhaisteach.
  4. SHELL - slighe chun an eadar-theangair àithne cleachdte.

Gu sònraichte, chan eil POSIX ag ràdh dad mu cò às a tha na luachan airson na caochladairean sin a’ tighinn.

Neach-reic as fheàrr - Vixie cron 3.0pl1

Is e sinnsear cumanta nan caochlaidhean cron mòr-chòrdte Vixie cron 3.0pl1, a chaidh a thoirt a-steach air liosta puist comp.sources.unix ann an 1992. Beachdaichidh sinn nas mionaidiche air prìomh fheartan an dreach seo.

Bidh Vixie cron a’ tighinn ann an dà phrògram (cron agus crontab). Mar as àbhaist, tha e an urra ris an daemon gnìomhan a leughadh agus a ruith bho bhòrd gnìomh an t-siostaim agus clàran gnìomh luchd-cleachdaidh fa-leth, agus tha uallach air goireas crontab airson clàran luchd-cleachdaidh a dheasachadh.

Clàr gnìomh agus faidhlichean rèiteachaidh

Tha an clàr gnìomh superuser suidhichte ann an /etc/crontab. Tha co-chòrdadh clàr an t-siostaim a 'freagairt ri co-chòrdadh Vixie cron, ach a-mhàin gu bheil an t-siathamh colbh ann a' comharrachadh ainm an neach-cleachdaidh a tha an gnìomh air a chur air bhog às a leth:

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

Tha clàran gnìomh cleachdaiche cunbhalach suidhichte ann an /var/cron/tabs/name-user agus a’ cleachdadh an aon cho-chòrdadh. Nuair a ruitheas tu an goireas crontab mar neach-cleachdaidh, is iad seo na faidhlichean a tha air an deasachadh.

Tha na liostaichean de luchd-cleachdaidh aig a bheil cothrom air crontab air an riaghladh anns na faidhlichean /var/cron/ allow agus /var/cron/deny, far nach fheum thu ach an t-ainm neach-cleachdaidh a chur a-steach ann an loidhne air leth.

Syntax leudaichte

An coimeas ri POSIX crontab, tha grunn atharrachaidhean glè fheumail ann am fuasgladh Paul Vixey air co-chòrdadh clàran gnìomh an goireas.

Tha co-chòrdadh bùird ùr ri fhaighinn: mar eisimpleir, faodaidh tu làithean na seachdain no mìosan a shònrachadh a rèir ainm (Diluain, Dimàirt, agus mar sin air adhart):

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

Faodaidh tu an ceum tro bheil gnìomhan air an cur air bhog a shònrachadh:

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

Faodar ceumannan agus amannan a mheasgachadh:

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

Thathas a’ toirt taic do roghainnean intuitive seach an co-chòrdadh àbhaisteach (ath-thòiseachadh, bliadhnail, bliadhnail, mìosail, seachdaineil, làitheil, meadhan oidhche, uair a thìde):

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

Àrainneachd coileanadh ghnìomhan

Leigidh Vixie cron leat àrainneachd ruith thagraidhean atharrachadh.

Chan eil na caochladairean àrainneachd USER, LOGNAME agus HOME dìreach air an toirt seachad leis an daemon, ach tha iad air an toirt o fhaidhle sgaoileadh. Tha an caochladair PATH air a shuidheachadh gu “/ usr/bin:/bin” agus tha an caochladair SHELL air a shuidheachadh gu “/ bin/sh”. Faodar luachan gach caochladair ach a-mhàin LOGNAME atharrachadh ann an clàran luchd-cleachdaidh.

Bidh cuid de chaochladairean àrainneachd (gu sònraichte SHELL agus DACHAIGH) air an cleachdadh le cron fhèin gus an obair a ruith. Seo cò ris a bhiodh cleachdadh bash an àite sh àbhaisteach airson gnìomhan àbhaisteach a ruith coltach:

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

Aig a 'cheann thall, thèid a h-uile caochladair àrainneachd a tha air a mhìneachadh sa chlàr (air a chleachdadh le cron no a dh' fheumas a 'phròiseas) a thoirt don ghnìomh ruith.

Gus faidhlichean a dheasachadh, bidh crontab a’ cleachdadh an deasaiche a chaidh a shònrachadh anns an caochladair àrainneachd VISUAL or EDITOR. Mura h-eil na caochladairean sin air am mìneachadh san àrainneachd far an deach crontab a ruith, thathas a’ cleachdadh “/usr/ucb/vi” (is dòcha gur e Oilthigh California, Berkeley a th’ ann an ucb).

cron air Debian agus Ubuntu

Tha luchd-leasachaidh Debian agus sgaoilidhean derivative air leigeil ma sgaoil dreach fìor atharraichte Vixie cron dreach 3.0pl1. Chan eil eadar-dhealachaidhean sam bith ann an co-chòrdadh faidhlichean bùird; airson luchd-cleachdaidh is e an aon Vixie cron a th ’ann. Feart Ùr as motha: Taic syslog, SELinux и PAM.

Tha atharrachaidhean nach eil cho follaiseach, ach so-fhaicsinneach a’ toirt a-steach suidheachadh faidhlichean rèiteachaidh agus clàran gnìomh.

Tha clàran cleachdaiche ann an Debian suidhichte anns an eòlaire / var/spool/cron/crontabs, tha clàr an t-siostaim fhathast ann - ann an / etc/crontab. Bithear a’ cur clàran gnìomh sònraichte air pasgan Debian ann an /etc/cron.d, às am bi an daemon cron gan leughadh gu fèin-ghluasadach. Tha smachd ruigsinneachd luchd-cleachdaidh fo smachd na faidhlichean /etc/cron.allow agus /etc/cron.deny.

Is e / bin / sh an t-slige àbhaisteach fhathast, a tha ann an Debian na shlige bheag a tha a’ gèilleadh ri POSIX dash, air a chuir air bhog gun a bhith a’ leughadh rèiteachadh sam bith (ann am modh neo-eadar-ghnìomhach).

Tha Cron fhèin anns na dreachan as ùire de Debian air a chuir air bhog tro systemd, agus faodar an rèiteachadh cur air bhog fhaicinn ann an /lib/systemd/system/cron.service. Chan eil dad sònraichte ann an rèiteachadh na seirbheis; faodar riaghladh gnìomh nas seòlta a dhèanamh tro chaochladairean àrainneachd air am foillseachadh gu dìreach ann an crontab gach neach-cleachdaidh.

cronie air RedHat, Fedora agus CentOS

cronie - forc de Vixie cron dreach 4.1. Mar a tha ann an Debian, chan eil an co-chòrdadh air atharrachadh, ach chaidh taic airson PAM agus SELinux, ag obair ann am brabhsair, a’ cumail sùil air faidhlichean a’ cleachdadh inotify agus feartan eile.

Tha an rèiteachadh bunaiteach anns na h-àiteachan àbhaisteach: tha clàr an t-siostaim ann an /etc/crontab, bidh pasganan a’ cur na bùird aca ann an /etc/cron.d, bidh bùird luchd-cleachdaidh a’ dol a-steach /var/spool/cron/crontabs.

Bidh an daemon a’ ruith fo smachd systemd, is e rèiteachadh na seirbheis /lib/systemd/system/crond.service.

Air sgaoilidhean coltach ri Red Hat, bidh / bin/sh air a chleachdadh gu bunaiteach aig toiseach tòiseachaidh, is e sin am bash àbhaisteach. Bu chòir a thoirt fa-near, nuair a bhios tu a’ ruith obraichean cron tro / bin/sh, gu bheil an slige bash a’ tòiseachadh ann am modh a tha a’ gèilleadh ri POSIX agus nach leugh e rèiteachadh a bharrachd, a’ ruith ann am modh neo-eadar-ghnìomhach.

cronie ann an SLES agus openSUSE

Bidh an cuairteachadh Gearmailteach SLES agus an toradh openSUSE aige a’ cleachdadh an aon chronie. Tha an daemon an seo cuideachd air a chuir air bhog fo systemd, tha rèiteachadh na seirbheis suidhichte ann an /usr/lib/systemd/system/cron.service. Configuration: /etc/crontab, /etc/cron.d, /var/spool/cron/tabs. / bin/sh an aon bash a’ ruith ann am modh neo-eadar-ghnìomhach a tha a’ gèilleadh ri POSIX.

Vixie cron inneal

Chan eil sliochd cron an latha an-diugh air atharrachadh gu mòr an coimeas ri Vixie cron, ach tha iad fhathast air feartan ùra fhaighinn nach eil riatanach gus prionnsapalan a 'phrògraim a thuigsinn. Tha mòran de na leudachaidhean sin air an droch dhealbhadh agus tha iad a’ cur a’ chòd troimhe-chèile. Tha an còd tùsail cron le Paul Vixey na thoileachas a leughadh.

Mar sin, chuir mi romham mion-sgrùdadh a dhèanamh air an inneal cron a’ cleachdadh an eisimpleir de phrògram cron a tha cumanta don dà mheur leasachaidh - Vixie cron 3.0pl1. Nì mi na h-eisimpleirean nas sìmplidhe le bhith a’ toirt air falbh ifdefs a bhios a’ dèanamh leughaidh nas toinnte agus a’ fàgail mion-fhiosrachadh.

Faodar obair an damhan-allaidh a roinn ann an grunn ìrean:

  1. Prògram tòiseachaidh.
  2. A’ cruinneachadh agus ag ùrachadh an liosta ghnìomhan a tha ri ruith.
  3. Prìomh lùb cron a 'ruith.
  4. Tòisich air obair.

Bheir sinn sùil orra ann an òrdugh.

Toiseach tòiseachaidh

Nuair a thòisicheas e, às deidh dha na h-argamaidean pròiseas a sgrùdadh, bidh cron a’ stàladh na làimhseachadh comharran SIGCHLD agus SIGHUP. Bidh a 'chiad fhear a' dèanamh log a-steach mu chrìochnachadh pròiseas an leanaibh, bidh an dàrna fear a 'dùnadh tuairisgeul faidhle an fhaidhle log:

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

Bidh an daemon cron an-còmhnaidh a’ ruith leis fhèin air an t-siostam, dìreach mar superuser agus bhon phrìomh eòlaire cron. Bidh na gairmean a leanas a’ cruthachadh faidhle glasaidh le PID a’ phròiseas daemon, dèan cinnteach gu bheil an neach-cleachdaidh ceart agus atharraich an eòlaire gnàthach chun phrìomh fhear:

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

Tha an t-slighe bunaiteach air a shuidheachadh, a thèid a chleachdadh nuair a thòisicheas tu air pròiseasan:

setenv("PATH", _PATH_DEFPATH, 1);

An uairsin tha am pròiseas “daemonized”: bidh e a’ cruthachadh leth-bhreac leanabh den phròiseas le bhith a ’gairm forc agus seisean ùr ann am pròiseas an leanaibh (seata gairm). Chan eil feum air a’ phròiseas phàrant tuilleadh, agus thig e a-mach:

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

Bidh crìoch air a 'phròiseas phàrant a' leigeil a-mach a 'ghlas air am faidhle glasaidh. A bharrachd air an sin, feumar am PID san fhaidhle ùrachadh don leanabh. Às deidh seo, tha an stòr-dàta gnìomhan air a lìonadh a-steach:

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

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

An uairsin gluaisidh Cro air adhart chun phrìomh chearcall obrach. Ach roimhe sin, is fhiach sùil a thoirt air a bhith a 'luchdachadh an liosta ghnìomhan.

A 'cruinneachadh agus ag ùrachadh an liosta ghnìomhan

Tha uallach air a’ ghnìomh load_database airson an liosta ghnìomhan a luchdachadh. Bidh e a’ sgrùdadh crontab a’ phrìomh shiostam agus an eòlaire le faidhlichean cleachdaiche. Mura h-atharraich na faidhlichean agus an eòlaire, cha tèid an liosta ghnìomhan ath-leughadh. Rud eile, bidh liosta ùr de ghnìomhan a’ tòiseachadh a’ cruthachadh.

A’ luchdachadh faidhle siostam le ainmean faidhle is bùird sònraichte:

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

A’ luchdachadh clàran cleachdaiche ann an lùb:

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

Às deidh sin thèid fear ùr a chuir na àite an t-seann stòr-dàta.

Anns na h-eisimpleirean gu h-àrd, tha gairm gnìomh process_crontab a’ dearbhadh gu bheil neach-cleachdaidh a tha a’ maidseadh ainm faidhle a’ bhùird ann (mura h-eil e na shàr-chleachdaiche) agus an uairsin a’ gairm load_user. Tha am fear mu dheireadh mu thràth a’ leughadh am faidhle fhèin loidhne air loidhne:

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

An seo, tha an caochladair àrainneachd air a shuidheachadh (loidhnichean den fhoirm VAR = luach) a’ cleachdadh na gnìomhan load_env / env_set, no tha an tuairisgeul gnìomh air a leughadh (* * * * * /path/to/exec) a’ cleachdadh a’ ghnìomh load_entry.

Is e an eintiteas inntrigidh a thilleas load_entry an obair againn, a tha air a chuir san liosta choitcheann de ghnìomhan. Bidh an gnìomh fhèin a’ dèanamh parsadh gnìomhair den chruth ùine, ach tha barrachd ùidh againn ann an cruthachadh caochladairean àrainneachd agus paramadairean cur air bhog gnìomh:

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

Bidh am prìomh lùb ag obair leis an liosta ghnìomhan gnàthach.

Prìomh lùb

Dh’ obraich an cron tùsail bho Tionndadh 7 Unix gu math sìmplidh: leugh e an rèiteachadh a-rithist ann an lùb, chuir e air bhog gnìomhan a’ mhionaid làithreach mar shàr-chleachdaiche, agus chaidil e gu toiseach na h-ath mhionaid. Dh'fheumadh an dòigh shìmplidh seo air seann innealan cus ghoireasan.

Chaidh dreach eile a mholadh ann an SysV, anns an deach an deamhan a chadal an dàrna cuid gus a’ mhionaid as fhaisge air an deach an gnìomh a mhìneachadh, no airson 30 mionaid. Chaidh nas lugha de ghoireasan ithe airson an rèiteachadh ath-leughadh agus gnìomhan sgrùdaidh sa mhodh seo, ach dh’ fhàs ùrachadh liosta nan gnìomhan gu sgiobalta mì-ghoireasach.

Thill Vixie cron gu bhith a’ sgrùdadh liostaichean gnìomh uair sa mhionaid, gu fortanach ro dheireadh nan 80n bha mòran a bharrachd ghoireasan air innealan àbhaisteach 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;
}

Tha an gnìomh cron_sleep an sàs gu dìreach ann a bhith a’ coileanadh ghnìomhan, a’ gairm na gnìomhan job_runqueue (àireamhaich is ruith gnìomhan) agus do_command (ruith gach gnìomh fa leth). Is fhiach an gnìomh mu dheireadh a sgrùdadh nas mionaidiche.

A 'ruith tasg

Tha an gnìomh do_command air a chuir gu bàs ann an deagh stoidhle Unix, is e sin, bidh e a’ dèanamh forc gus an obair a choileanadh gu neo-chinnteach. Tha am pròiseas pàrant a 'leantainn air adhart a' cur air bhog gnìomhan, bidh am pròiseas pàiste ag ullachadh a 'phròiseas gnìomh:

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

Tha tòrr loidsig ann am child_process: bidh e a’ gabhail ri sruthan toraidh agus mearachd àbhaisteach, an uairsin gan cur gu post (ma tha caochladair àrainneachd MAILTO air a shònrachadh sa chlàr gnìomh), agus, mu dheireadh, a’ feitheamh ri prìomh phròiseas na h-obrach. coileanta.

Tha am pròiseas obrach air a chruthachadh le forc eile:

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

Is e sin gu bunaiteach a th’ ann an cron. Dh'fhàg mi mion-fhiosrachadh inntinneach, mar eisimpleir, a 'toirt cunntas air luchd-cleachdaidh iomallach, ach mhìnich mi am prìomh rud.

Post-d gu caraid

Tha Cron na phrògram iongantach sìmplidh agus feumail, air a dhèanamh anns na traidiseanan as fheàrr ann an saoghal Unix. Chan eil i a’ dèanamh dad a bharrachd, ach tha i air a bhith a’ dèanamh a cuid obrach gu h-iongantach airson grunn deicheadan a-nis. Cha tug e barrachd air uair a thìde faighinn tron ​​chòd airson an dreach a tha a’ tighinn le Ubuntu, agus bha tòrr spòrs agam! Tha mi an dòchas gun robh e comasach dhomh a roinn leat.

Chan eil fios agam mu do dheidhinn, ach tha mi rud beag brònach a bhith a’ tuigsinn nach eil prògramadh an latha an-diugh, leis a’ chlaonadh a bhith a’ dèanamh cus iom-fhillte agus ro-ghearr, air a bhith cho sìmplidh airson ùine mhòr.

Tha mòran roghainnean ùr-nodha ann seach cron: leigidh systemd-timers leat siostaman iom-fhillte a chuir air dòigh le eisimeileachd, leigidh fcron leat caitheamh ghoireasan a riaghladh le gnìomhan ann an dòigh nas sùbailte. Ach gu pearsanta, bha an crontab as sìmplidh an-còmhnaidh gu leòr dhomh.

Ann an ùine ghoirid, gràdhaich Unix, cleachd prògraman sìmplidh agus na dìochuimhnich mana an àrd-ùrlar agad a leughadh!

Source: www.habr.com

Cuir beachd ann