Cron ho Linux: nalane, tšebeliso le sesebelisoa

Cron ho Linux: nalane, tšebeliso le sesebelisoa

The classic e ile ea ngola hore lihora tse thabisang ha li shebelle. Linakong tseo tse hlaha ho ne ho se na baetsi ba mananeo kapa Unix, empa kajeno baetsi ba mananeo ba tseba hantle: cron e tla boloka tlaleho ea nako ho e-na le bona.

Lisebelisoa tsa mohala oa taelo ke bofokoli le mosebetsi o boima ho 'na. sed, awk, wc, cut le mananeo a mang a khale a tsamaisoa ke mangolo ho li-server tsa rona letsatsi le leng le le leng. Tse ngata tsa tsona li entsoe e le mesebetsi bakeng sa cron, kemiso ea ho tloha ho 70s.

Ka nako e telele ke ne ke sebelisa cron ka holimo, ntle le ho kena ka lintlha, empa ka letsatsi le leng, ha ke kopana le phoso ha ke ntse ke tsamaisa script, ke ile ka etsa qeto ea ho e sheba ka botlalo. Ena ke tsela eo sengoloa sena se hlahileng ka eona, ha ke ntse ke e ngola ke ile ka tloaelana le POSIX crontab, likhetho tsa mantlha tsa cron ho li-distributions tse tsebahalang tsa Linux le sebopeho sa tse ling tsa tsona.

Na u sebelisa Linux mme u tsamaisa mesebetsi ea cron? A na u thahasella meralo ea ts'ebeliso ea sistimi ho Unix? Joale re tseleng!

Tse ka hare

Tšimoloho ea mefuta

Ts'ebetso ea nako le nako ea mananeo a basebelisi kapa sistimi ke tlhokahalo e hlakileng lits'ebetsong tsohle tsa ts'ebetso. Ka hona, baetsi ba mananeo ba ile ba hlokomela tlhoko ea lits'ebeletso tse ba lumellang ho rala le ho etsa mesebetsi khale.

Sistimi ea ts'ebetso ea Unix e ts'oara tšimoloho ea eona ho tsoa ho Version 7 Unix, e ntlafalitsoeng lilemong tsa bo-70 tsa lekholo le fetileng la Bell Labs, ho kenyeletsoa le Ken Thompson ea tummeng. Version 7 Unix e boetse e kenyelletsa cron, ts'ebeletso ea ho etsa mesebetsi ea superuser khafetsa.

Cron e tloaelehileng ea sejoale-joale ke lenaneo le bonolo, empa algorithm ea ts'ebetso ea mofuta oa mantlha e ne e le bonolo le ho feta: ts'ebeletso e ne e tsoha hang ka motsotso, e bala tafole e nang le mesebetsi ho tsoa faeleng e le 'ngoe (/etc/lib/crontab) mme e etsetsoa superuser mesebetsi eo e neng e lokela hore ebe e entsoe hona joale.

Kamora moo, mefuta e ntlafalitsoeng ea ts'ebeletso e bonolo le e sebetsang e ile ea fanoa ka lits'ebetso tsohle tsa ts'ebetso tse kang Unix.

Litlhaloso tse akaretsang tsa sebopeho sa crontab le melaoana ea mantlha ea ts'ebetso ea ts'ebetso li kenyellelitsoe maemong a mantlha a lits'ebetso tse ts'oanang tsa Unix - POSIX - ka 1992, mme ka hona cron e tsoang ho standard de facto e ile ea fetoha standard de jure.

Ka 1987, Paul Vixie, ha a se a hlahlobile basebelisi ba Unix ka litakatso tsa bona tsa cron, o ile a lokolla phetolelo e 'ngoe ea daemon e ileng ea lokisa mathata a mang a cron ea setso le ho atolosa syntax ea lifaele tsa tafole.

Ka phetolelo ea boraro ea Vixie cron o ile a qala ho finyella litlhoko tsa POSIX, ho phaella moo, lenaneo le ne le e-na le laesense ea bolokolohi, kapa ho e-na le hoo ho ne ho se na laesense ho hang, ntle le litakatso tse ho README: mongoli ha a fane ka tiiso, lebitso la mongoli. e ke ke ea hlakoloa, 'me lenaneo le ka rekisoa feela hammoho le khoutu ea mohloli. Litlhoko tsena li ile tsa fetoha tse lumellanang le melao-motheo ea software e sa lefelloeng e neng e ntse e tsebahala lilemong tseo, kahoo tse ling tsa likarolo tsa bohlokoa tsa Linux tse ileng tsa hlaha mathoasong a lilemo tsa bo-90 li ile tsa nka Vixie cron e le tsamaiso ea tsona 'me li ntse li e ntlafatsa le kajeno.

Haholo-holo, Red Hat le SUSE li hlahisa fereko ea Vixie cron - cronie, 'me Debian le Ubuntu ba sebelisa khatiso ea pele ea Vixie cron e nang le lipache tse ngata.

Ha re qale ho tloaelana le crontab ea tšebeliso ea mosebelisi e hlalositsoeng ho POSIX, ka mor'a moo re tla sheba li-extensions tsa syntax tse fanoeng ho Vixie cron le ts'ebeliso ea mefuta e fapaneng ea Vixie cron lipapatsong tse tsebahalang tsa Linux. 'Me qetellong, ciliegia ka kuku ke tlhahlobo ea sesebelisoa sa cron daemon.

POSIX crontab

Haeba cron ea pele e ne e lula e sebetsa bakeng sa superuser, bahlophisi ba mehleng ea kajeno ba atisa ho sebetsana le mesebetsi ea basebelisi ba tloaelehileng, e sireletsehileng le e bonolo haholoanyane.

Crons e fanoa e le sehlopha sa mananeo a mabeli: cron daemon e lulang e sebetsa le ts'ebeliso ea crontab e fumanehang ho basebelisi. Ea morao-rao e u lumella ho hlophisa litafole tsa mesebetsi tse tobileng mosebelisi e mong le e mong oa sistimi, ha daemon e qala mesebetsi ho tsoa ho litafole tsa basebelisi le sistimi.

В POSIX e tloaelehileng boits'oaro ba daemon ha bo hlalosoe ka tsela efe kapa efe mme ke lenaneo la mosebelisi feela le hlophisitsoeng crontab. Ho ba teng ha mekhoa ea ho qala mesebetsi ea basebelisi, ehlile, ho boletsoe, empa ha ho hlalosoe ka botlalo.

Ka ho letsetsa crontab utility, o ka etsa lintho tse 'ne: hlophisa tafole ea mesebetsi ea mosebelisi ho mohlophisi, kenya tafole ho tsoa faeleng, bonts'a tafole ea mesebetsi ea hajoale, le ho hlakola tafole ea mosebetsi. Mehlala ea hore na sesebelisoa sa crontab se sebetsa joang:

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

Ha o bitsoa crontab -e ho tla sebelisoa mohlophisi ea boletsoeng ka mokhoa o tloaelehileng oa tikoloho EDITOR.

Mesebetsi ka boeona e hlalosoa ka mokhoa o latelang:

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

Libaka tse hlano tsa pele tsa litlaleho: metsotso [1..60], lihora [0..23], matsatsi a khoeli [1..31], likhoeli [1..12], matsatsi a beke [0. .6], moo 0 e leng Sontaha. Ea ho qetela, ea botšelela, tšimo ke mola o tla etsoa ke mofetoleli ea tloaelehileng oa taelo.

Likarolong tse hlano tsa pele, litekanyetso li ka thathamisoa li arotsoe ke lifeeloana:

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

Kapa ka leqhubu:

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

Phihlello ea mosebelisi ho kemiso ea mesebetsi e laoloa ho POSIX ke lifaele tsa cron.allow le cron.deny, tse thathamisang basebelisi ba nang le phihlello ea crontab le basebelisi ntle le phihlello ea lenaneo, ka ho latellana. Tekanyetso ha e laole sebaka sa lifaele tsena ka tsela efe kapa efe.

Ho latela maemo, bonyane mefuta e mene ea tikoloho e tlameha ho fetisetsoa mananeong a qalileng:

  1. HOME - bukana ea lapeng ea mosebelisi.
  2. LOGNAME - ho kena ha basebelisi.
  3. PATH ke tsela eo u ka fumanang lisebelisoa tse tloaelehileng tsa sistimi.
  4. SHELL - tsela e eang ho toloko ea taelo e sebelisitsoeng.

Haholo-holo, POSIX ha e bue letho ka hore na litekanyetso tsa mefuta ena li tsoa hokae.

Morekisi ka ho fetisisa - Vixie cron 3.0pl1

Ntate-moholo ea tloaelehileng oa mefuta e mengata ea cron ke Vixie cron 3.0pl1, e hlahisitsoeng lethathamong la mangolo la comp.sources.unix ka 1992. Re tla hlahloba lintlha tse ka sehloohong tsa phetolelo ena ka ho qaqileng haholoanyane.

Vixie cron e tla ka mananeo a mabeli (cron le crontab). Joalo ka tloaelo, daemon e na le boikarabello ba ho bala le ho tsamaisa mesebetsi ho tsoa tafoleng ea mesebetsi ea sistimi le litafole tsa mesebetsi ea mosebelisi ka mong, mme ts'ebeliso ea crontab e ikarabella bakeng sa ho hlophisa litafole tsa basebelisi.

Tafole ea mesebetsi le lifaele tsa tlhophiso

Tafole ea mosebetsi oa superuser e fumaneha ho /etc/crontab. Syntax ea tafole ea sistimi e lumellana le syntax ea Vixie cron, ntle le hore kholomo ea botšelela ho eona e bonts'a lebitso la mosebelisi eo mosebetsi o qalisoang molemong oa hae:

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

Litafole tsa kamehla tsa basebelisi li fumaneha ho /var/cron/tabs/username mme li sebelisa syntax e tšoanang. Ha o tsamaisa ts'ebeliso ea crontab joalo ka mosebelisi, tsena ke lifaele tse hlophisitsoeng.

Manane a basebelisi ba nang le phihlello ea crontab a laoloa ho / var / cron / lumella le / var / cron / hana lifaele, moo o hlokang feela ho kenya lebitso la mosebelisi moleng o arohaneng.

Syntax e atolositsoeng

Ha ho bapisoa le POSIX crontab, tharollo ea Paul Vixey e na le liphetoho tse 'maloa tsa bohlokoa ho syntax ea litafole tsa mesebetsi ea ts'ebeliso.

Syntax e ncha ea tafole e se e fumaneha: mohlala, o ka hlakisa matsatsi a beke kapa likhoeli ka mabitso (Mantaha, Labone, joalo-joalo):

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

O ka hlakisa mohato oo mesebetsi e qalisoang ka oona:

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

Mehato le linako li ka kopanngoa:

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

Mekhoa e meng e hlakileng ea syntax e tloaelehileng e tšehetsoa (ho qala bocha, selemo le selemo, selemo le selemo, khoeli le khoeli, beke le beke, letsatsi le letsatsi, har'a mp'a bosiu, hora):

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

Tikoloho ya tshebetso

Vixie cron e u lumella ho fetola tikoloho ea lits'ebetso tse sebetsang.

Liphetoho tsa tikoloho USER, LOGNAME le HOME ha li fanoe feela ke daemon, empa li nkiloe faeleng. passwd. Phapang ea PATH e behiloe ho "/usr/bin:/bin" mme SHELL e fetotsoe ho "/bin/sh". Litekanyetso tsa mefuta eohle ntle le LOGNAME li ka fetoloa litafoleng tsa basebelisi.

Mefuta e meng ea tikoloho (haholo-holo SHELL le HOME) e sebelisoa ke cron ka boeona ho tsamaisa mosebetsi. Mona ke seo ho sebelisa bash sebakeng sa sh e tloaelehileng ho tsamaisa mesebetsi e tloaelehileng ho ka shebahalang joalo:

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

Qetellong, mefuta eohle ea tikoloho e hlalositsoeng tafoleng (e sebelisoang ke cron kapa e hlokehang ke ts'ebetso) e tla fetisetsoa mosebetsing o sebetsang.

Ho hlophisa lifaele, crontab e sebelisa mohlophisi o boletsoeng ho VISUAL kapa EDITOR tikoloho e fapaneng. Haeba tikoloho eo crontab e neng e tsamaisoa ho eona e se na mefuta ena e hlalositsoeng, joale "/usr/ucb/vi" e sebelisoa (ucb mohlomong ke Univesithi ea California, Berkeley).

cron ho Debian le Ubuntu

Bahlahisi ba li-Debian le li-derivative distributions ba lokollotse e fetotsoeng haholo Mofuta oa Vixie cron 3.0pl1. Ha ho na liphapang ho syntax ea lifaele tsa tafole; bakeng sa basebelisi ke Vixie cron e tšoanang. Ntho e Ncha e Kholo ka ho Fetisisa: Tšehetso syslog, SELinux и PAM.

Liphetoho tse sa bonahaleng, empa tse bonahalang li kenyelletsa sebaka sa lifaele tsa tlhophiso le litafole tsa mesebetsi.

Litafole tsa basebelisi ho Debian li fumaneha ho /var/spool/cron/crontabs directory, tafole ea sistimi e ntse e le teng - ho /etc/crontab. Litafole tsa mesebetsi tse ikhethileng ka har'a sephutheloana sa Debian li behiloe ho /etc/cron.d, ho tloha moo cron daemon e li balang ka bo eona. Taolo ea phihlello ea basebelisi e laoloa ke lifaele tsa /etc/cron.allow le /etc/cron.deny.

Khetla ea kamehla e ntse e le /bin/sh, eo ho Debian e leng khetla e nyane e lumellanang le POSIX Dash, e qalisoa ntle le ho bala tlhophiso efe kapa efe (ka mokhoa o sa kopaneleng).

Cron ka boeona liphetolelong tsa morao-rao tsa Debian e qalisoa ka systemd, 'me tlhophiso ea ho qala e ka bonoa ho /lib/systemd/system/cron.service. Ha ho na letho le ikhethileng tlhophisong ea lits'ebeletso; taolo efe kapa efe e poteletseng e ka etsoa ka mefuta e fapaneng ea tikoloho e phatlalalitsoeng ka kotloloho ho crontab ea mosebelisi e mong le e mong.

cronie ho RedHat, Fedora le CentOS

krone - fereko ea mofuta oa Vixie cron 4.1. Joalo ka ho Debian, syntax ha e so fetohe, empa tšehetso bakeng sa PAM le SELinux, e sebetsang ka sehlopha, ho latela lifaele tse sebelisang inotify le likarolo tse ling li kentsoe.

Sebopeho sa kamehla se libakeng tse tloaelehileng: tafole ea tsamaiso e ho /etc/crontab, liphutheloana li beha litafole tsa tsona ho /etc/cron.d, litafole tsa basebelisi li kena /var/spool/cron/crontabs.

Daemon e sebetsa tlas'a taolo ea systemd, tlhophiso ea litšebeletso ke /lib/systemd/system/crond.service.

Ho li-distributions tse kang Red Hat, /bin/sh e sebelisoa ka ho sa feleng qalong, e leng bash e tloaelehileng. Hoa lokela ho hlokomeloa hore ha u sebelisa cron jobs ka / bin/sh, khetla ea bash e qala ka mokhoa o lumellanang le POSIX 'me ha e bale tlhophiso leha e le efe e eketsehileng, e sebetsang ka mokhoa o sa sebetsaneng.

cronie ho SLES le openSUSE

Kabo ea Sejeremane SLES le derivative ea eona OpenSUSE e sebelisa cronie e tšoanang. Daemon mona e boetse e qalisoa tlas'a systemd, tlhophiso ea litšebeletso e fumaneha ho /usr/lib/systemd/system/cron.service. Tlhophiso: /etc/crontab, /etc/cron.d, /var/spool/cron/tabs. /bin/sh ke bash e ts'oanang e sebetsang ka mokhoa o sa sebetseng oa POSIX.

Sesebelisoa sa Vixie cron

Litloholo tsa kajeno tsa cron ha lia fetoha haholo ha li bapisoa le Vixie cron, empa li ntse li fumana likarolo tse ncha tse sa hlokeng ho utloisisa melao-motheo ea lenaneo. Tse ngata tsa likeketso tsena ha lia etsoa hantle ebile li ferekanya khoutu. Khoutu ea mantlha ea cron ea Paul Vixey e monate ho e bala.

Ka hona, ke nkile qeto ea ho sekaseka sesebelisoa sa cron ke sebelisa mohlala oa lenaneo la cron le tloaelehileng ho makala a mabeli a nts'etsopele - Vixie cron 3.0pl1. Ke tla nolofatsa mehlala ka ho tlosa li-ifdefs tse thatafatsang ho bala le ho siea lintlha tse nyane.

Mosebetsi oa modemona o ka aroloa ka mekhahlelo e mengata:

  1. Ho qala lenaneo.
  2. Ho bokella le ho nchafatsa lenane la mesebetsi e lokelang ho etsoa.
  3. Main cron loop e sebetsa.
  4. Qala mosebetsi.

A re li shebeng ka tatellano.

Ho qala

Ha e qala, ka mor'a ho hlahloba likhang tsa ts'ebetso, cron e kenya lisebelisoa tsa matšoao a SIGCHLD le SIGHUP. Ea pele e kenya tlaleho ea ho felisoa ha ts'ebetso ea ngoana, ea bobeli e koala tlhaloso ea faele ea faele ea log:

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

Cron daemon e lula e sebetsa e le mong ho sistimi, feela e le superuser le ho tsoa bukeng e kholo ea cron. Mehala e latelang e theha faele ea senotlolo ka PID ea ts'ebetso ea daemon, etsa bonnete ba hore mosebelisi o nepile mme o fetole bukana ea hajoale ho ea mantlha:

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

Tsela ea kamehla e behiloe, e tla sebelisoa ha ho qala mekhoa:

setenv("PATH", _PATH_DEFPATH, 1);

Joale ts'ebetso e "daemonized": e etsa kopi ea ngoana ea ts'ebetso ka ho letsetsa fereko le lenaneo le lecha ts'ebetsong ea ngoana (ho bitsa setsid). Ts'ebetso ea motsoali ha e sa hlokahala, 'me ea tsoa:

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

Ho felisoa ha ts'ebetso ea motsoali ho lokolla senotlolo faeleng ea senotlolo. Ntle le moo, hoa hlokahala ho nchafatsa PID faeleng ho ngoana. Ka mor'a sena, database ea mosebetsi e tlatsitsoe ka:

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

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

Ebe cron e fetela pele ho potoloho e kholo ea mosebetsi. Empa pele ho moo, ho bohlokoa ho sheba ho kenya lenane la mesebetsi.

Ho bokella le ho nchafatsa lenane la mesebetsi

Mosebetsi oa load_database o ikarabella ho kenya lenane la mesebetsi. E lekola crontab ea mantlha ea sistimi le bukana e nang le lifaele tsa mosebelisi. Haeba lifaele le directory li sa fetoha, lenane la mesebetsi ha le baloe hape. Ho seng joalo, lethathamo le lecha la mesebetsi le qala ho theha.

Ho kenya faele ea sistimi e nang le mabitso a khethehileng a faele le litafole:

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

E kenya litafole tsa mosebelisi ka lerupu:

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

Ka mor'a moo database ea khale e nkeloa sebaka ke e ncha.

Mehlaleng e kaholimo, mohala oa ts'ebetso_crontab o netefatsa hore mosebelisi ea tšoanang le lebitso la faele ea tafole o teng (ntle le haeba e le superuser) ebe o bitsa load_user. Ea morao o se a ntse a bala faele ka boeona mola ka mola:

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

Mona, ebang phapang ea tikoloho e behiloe (mela ea mofuta oa VAR=value) ho sebelisoa mesebetsi ea load_env / env_set, kapa tlhaloso ea mosebetsi e baloa (* * * * * /path/to/exec) ho sebelisoa mosebetsi oa load_entry.

Setsi sa ho kena se khutlisang load_entry ke mosebetsi oa rona, o behiloeng lethathamong le akaretsang la mesebetsi. Ts'ebetso ka boeona e fana ka tlhaloso ea verbose ea sebopeho sa nako, empa re thahasella ho theha mefuta e fapaneng ea tikoloho le liparamente tsa ho qala mosebetsi:

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

Loop e kholo e sebetsa le lenane la hajoale la mesebetsi.

Loop e ka Sehloohong

Cron ea mantlha e tsoang ho Version 7 Unix e sebelitse ka mokhoa o bonolo: e ile ea bala hape tlhophiso ka loop, ea thakhola mesebetsi ea motsotso oa hajoale e le superuser, mme ea robala ho fihlela qalong ea motsotso o latelang. Mokhoa ona o bonolo oa mechini ea khale o ne o hloka lisebelisoa tse ngata haholo.

Ho hlahisitsoe mofuta o mong ho SysV, moo daemon e ileng ea robala ho fihlela motsotso o haufi oo mosebetsi o hlalositsoeng ka oona, kapa metsotso e 30. Lisebelisoa tse fokolang li ile tsa sebelisoa bakeng sa ho bala bocha le ho hlahloba mesebetsi ka mokhoa ona, empa ho ntlafatsa ka potlako lethathamo la mesebetsi ho ile ha fetoha bothata.

Vixie cron o khutletse ho lekola manane a mesebetsi hang ka motsotso, ka lehlohonolo qetellong ea lilemo tsa bo-80 ho ne ho e-na le lisebelisoa tse ngata ho mechini e tloaelehileng ea 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;
}

Mosebetsi oa cron_sleep o ameha ka ho toba ho phethahatsa mesebetsi, ho bitsa mosebetsi_runqueue (bala le ho etsa mesebetsi) le do_command (tsamaisa mosebetsi o mong le o mong). Mosebetsi oa ho qetela o lokela ho hlahlojoa ka botlalo.

Ho matha mosebetsi

Mosebetsi oa do_command o etsoa ka mokhoa o motle oa Unix, ke hore, o etsa fereko ho etsa mosebetsi ka mokhoa o sa tsitsang. Ts'ebetso ea motsoali e ntse e tsoela pele ho qala mesebetsi, ts'ebetso ea ngoana e lokisa ts'ebetso ea mosebetsi:

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

Ho na le mabaka a mangata ho child_process: e hloka tlhahiso e tloaelehileng le melapo ea liphoso ho eona, e le hore e ka e romela ka poso (haeba maemo a MAILTO a feto-fetoha a hlalositsoe tafoleng ea mosebetsi), 'me, qetellong, e emela sehlooho. mokhoa oa ho phetha mosebetsi.

Ts'ebetso ea ts'ebetso e etsoa ke fereko e 'ngoe:

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

Ke sona feela seo cron e leng sona. Ke tlohetse lintlha tse ling tse khahlisang, ka mohlala, ho ikarabella bakeng sa basebelisi ba hole, empa ke hlalositse ntho e ka sehloohong.

Afterword

Cron ke lenaneo le bonolo le le sebetsang ka mokhoa o makatsang, le entsoeng ka litloaelo tse ntlehali tsa lefats'e la Unix. Ha a etse letho le eketsehileng, empa o se a ntse a etsa mosebetsi oa hae ka mokhoa o makatsang ka lilemo tse mashome a 'maloa joale. Ho fumana khoutu ea mofuta o tlang le Ubuntu ha hoa ka ha nka nako e fetang hora, 'me ke ne ke natefeloa haholo! Ke tšepa hore ke khonne ho e arolelana le uena.

Ha ke tsebe ka uena, empa ke masoabi hanyenyane ho hlokomela hore mananeo a morao-rao, a nang le tšekamelo ea ho rarahana ho feta tekano le ho feta, ha aa ka a thusa ho nolofatsa ho joalo ka nako e telele.

Ho na le mekhoa e mengata ea sejoale-joale ea cron: li-systemd-timers li u lumella ho hlophisa lits'ebetso tse rarahaneng tse nang le litšepe, fcron e u lumella ho laola tšebeliso ea lisebelisoa habonolo ka mesebetsi. Empa ka bonna, crontab e bonolo ka ho fetisisa e ne e lula e lekane bakeng sa ka.

Ka bokhutšoanyane, rata Unix, sebelisa mananeo a bonolo 'me u se ke ua lebala ho bala manane bakeng sa sethala sa hau!

Source: www.habr.com

Eketsa ka tlhaloso