Cron hauv Linux: keeb kwm, siv thiab ntaus ntawv

Cron hauv Linux: keeb kwm, siv thiab ntaus ntawv

Cov classic sau tias zoo siab teev tsis saib. Nyob rau lub sijhawm qus no tsis muaj programmers lossis Unix, tab sis niaj hnub programmers paub tseeb: cron yuav taug qab lub sijhawm hloov lawv.

Cov khoom siv kab hais kom ua yog ob qho tib si tsis muaj zog thiab ua haujlwm rau kuv. sed, awk, wc, txiav thiab lwm yam kev pabcuam qub yog khiav los ntawm cov ntawv sau ntawm peb cov servers txhua hnub. Ntau ntawm lawv tau tsim los ua cov haujlwm rau cron, lub sijhawm teem sijhawm los ntawm 70s.

Tau ntev kuv siv cron superficially, tsis mus rau hauv cov ntsiab lus, tab sis muaj ib hnub, thaum kuv ntsib ib qho yuam kev thaum khiav ib tsab ntawv, kuv txiav txim siab mus saib nws kom huv si. Qhov no yog li cas tsab xov xwm no tshwm sim, thaum sau nws kuv tau paub txog POSIX crontab, cov kev xaiv tseem ceeb hauv kev faib Linux nrov thiab cov qauv ntawm qee qhov ntawm lawv.

Puas yog koj siv Linux thiab ua haujlwm cron? Koj puas txaus siab rau qhov system thov architecture hauv Unix? Ces peb nyob ntawm peb txoj kev!

Txheem

Keeb kwm ntawm hom

Kev ua tiav txhua lub sijhawm ntawm cov neeg siv lossis cov kev pabcuam system yog qhov tsim nyog pom tseeb hauv txhua qhov kev khiav haujlwm. Yog li ntawd, cov programmers paub txog qhov xav tau ntawm cov kev pabcuam uas tso cai rau lawv los ua haujlwm hauv nruab nrab thiab ua haujlwm ntev dhau los.

Unix-zoo li kev khiav hauj lwm systems taug qab lawv cov keeb kwm rov qab mus rau Version 7 Unix, tsim nyob rau hauv lub 70s ntawm lub xyoo pua xeem ntawm Bell Labs, suav nrog los ntawm nto moo Ken Thompson. Version 7 Unix kuj suav nrog cron, ib qho kev pabcuam rau kev ua haujlwm tsis tu ncua superuser.

Ib tug niaj hnub cron yog ib tug yooj yim kev pab cuam, tab sis cov kev khiav hauj lwm algorithm ntawm tus thawj version yog txawm yooj yim: cov kev pab cuam sawv ib zaug ib feeb, nyeem ib lub rooj nrog cov dej num los ntawm ib cov ntaub ntawv (/etc/lib/crontab) thiab ua rau lub superuser cov haujlwm uas yuav tsum tau ua nyob rau lub sijhawm tam sim no.

Tom qab ntawd, txhim kho cov qauv ntawm cov kev pabcuam yooj yim thiab muaj txiaj ntsig tau muab nrog txhua qhov kev ua haujlwm zoo li Unix.

Cov lus piav qhia dav dav ntawm cov qauv crontab thiab cov ntsiab lus tseem ceeb ntawm kev siv hluav taws xob ua haujlwm tau suav nrog hauv tus qauv tseem ceeb ntawm Unix-zoo li kev khiav hauj lwm systems - POSIX - nyob rau hauv 1992, thiab yog li cron los ntawm tus txheej txheem de facto tau los ua tus qauv de jure.

Xyoo 1987, Paul Vixie, tau tshawb fawb Unix cov neeg siv txog lawv qhov kev xav tau rau cron, tau tso tawm lwm qhov ntawm daemon uas kho qee qhov teeb meem ntawm cov tsoos cron thiab nthuav dav cov syntax ntawm cov ntaub ntawv.

Los ntawm qhov thib peb version ntawm Vixie cron pib ua kom tau raws li POSIX cov cai, ntxiv rau, qhov kev zov me nyuam muaj daim ntawv tso cai ywj pheej, lossis tsis muaj ntawv tso cai txhua, tshwj tsis yog qhov xav tau hauv README: tus sau tsis muab kev lees paub, tus sau lub npe tsis tuaj yeem raug tshem tawm, thiab qhov kev zov me nyuam tsuas yog muag ua ke nrog qhov chaws. Cov kev cai no tau dhau los ua tau raws li cov hauv paus ntsiab lus ntawm cov software dawb uas tau txais kev nyiam nyob rau xyoo ntawd, yog li qee qhov tseem ceeb ntawm Linux kev faib tawm uas tau tshwm sim thaum ntxov 90s coj Vixie cron ua lawv qhov system ib qho thiab tseem tab tom tsim nws niaj hnub no.

Hauv particular, Red Hat thiab SUSE tsim ib rab rawg ntawm Vixie cron - cronie, thiab Debian thiab Ubuntu siv thawj tsab ntawm Vixie cron nrog ntau thaj ua rau thaj.

Cia peb xub paub txog tus neeg siv khoom siv hluav taws xob crontab piav qhia hauv POSIX, tom qab ntawd peb yuav saib cov kab ke txuas ntxiv uas tau muab hauv Vixie cron thiab kev siv cov kev hloov pauv ntawm Vixie cron hauv Linux nrov. Thiab thaum kawg, cherry ntawm lub ncuav mog qab zib yog kev tsom xam ntawm cron daemon ntaus ntawv.

POSIX crontab

Yog tias tus thawj cron ib txwm ua haujlwm rau tus superuser, cov neeg ua haujlwm niaj hnub no feem ntau cuam tshuam nrog cov haujlwm ntawm cov neeg siv zoo tib yam, uas muaj kev nyab xeeb dua thiab yooj yim dua.

Crons tau muab los ua ib txheej ntawm ob qhov kev pab cuam: kev ua haujlwm tas li cron daemon thiab crontab utility muaj rau cov neeg siv. Cov tom kawg tso cai rau koj los kho cov rooj ua haujlwm tshwj xeeb rau txhua tus neeg siv hauv lub kaw lus, thaum lub daemon pib ua haujlwm los ntawm cov neeg siv thiab cov rooj ua haujlwm.

В POSIX txuj tus cwj pwm ntawm daemon tsis tau piav qhia nyob rau hauv ib txoj kev thiab tsuas yog cov neeg siv kev pab cuam yog formalized crontab. Lub hav zoov ntawm cov txheej txheem rau kev tso tawm cov neeg siv cov dej num yog, ntawm chav kawm, implied, tab sis tsis tau piav nyob rau hauv kom meej.

Los ntawm kev hu rau crontab utility, koj tuaj yeem ua plaub yam: kho tus neeg siv lub rooj ua haujlwm hauv tus editor, thauj lub rooj los ntawm cov ntaub ntawv, qhia lub rooj ua haujlwm tam sim no, thiab tshem tawm cov lus ua haujlwm. Piv txwv li cas crontab utility ua haujlwm:

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

Thaum hu crontab -e tus editor uas teev nyob rau hauv tus txheej txheem ib puag ncig hloov pauv yuav raug siv EDITOR.

Cov dej num lawv tus kheej tau piav qhia hauv cov qauv hauv qab no:

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

Thawj tsib daim teb ntawm cov ntaub ntawv: feeb [1..60], teev [0..23], hnub ntawm lub hli [1..31], hli [1..12], hnub ntawm lub lis piam [0. .6], qhov twg 0 yog hnub Sunday. Qhov kawg, thib rau, daim teb yog ib txoj kab uas yuav raug coj los ntawm tus neeg txhais lus tus qauv.

Hauv thawj tsib lub teb, cov txiaj ntsig tuaj yeem sau tau cais los ntawm commas:

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

Los yog nrog hyphen:

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

Cov neeg siv nkag mus rau lub sijhawm teem sijhawm ua haujlwm yog tswj hwm hauv POSIX los ntawm cron.allow thiab cron.deny cov ntaub ntawv, uas teev cov neeg siv nkag mus rau crontab thiab cov neeg siv yam tsis muaj kev nkag mus rau qhov program, feem. Tus qauv tsis tswj qhov chaw ntawm cov ntaub ntawv no nyob rau hauv ib txoj kev.

Raws li tus qauv, tsawg kawg yog plaub qhov kev hloov pauv ib puag ncig yuav tsum raug xa mus rau cov kev pab cuam pib:

  1. HOME - tus neeg siv lub tsev directory.
  2. LOGNAME — tus neeg siv nkag mus.
  3. PATH yog txoj hauv kev uas koj tuaj yeem nrhiav cov qauv siv hluav taws xob.
  4. SHELL — txoj hauv kev mus rau tus neeg txhais lus siv.

Qhov tseem ceeb, POSIX tsis hais dab tsi txog qhov twg cov txiaj ntsig rau cov kev hloov pauv no los ntawm.

Tus neeg muag khoom zoo tshaj plaws - Vixie cron 3.0pl1

Cov poj koob yawm txwv ntawm cov npe nrov cron variants yog Vixie cron 3.0pl1, qhia hauv comp.sources.unix mailing list hauv 1992. Peb yuav xav txog cov yam ntxwv tseem ceeb ntawm qhov version no kom ntxaws ntxiv.

Vixie cron los hauv ob txoj haujlwm (cron thiab crontab). Raws li ib txwm muaj, tus daemon yog lub luag haujlwm rau kev nyeem ntawv thiab ua haujlwm los ntawm lub system ua haujlwm lub rooj thiab cov rooj ua haujlwm ntawm tus neeg siv, thiab cov khoom siv hluav taws xob crontab yog lub luag haujlwm rau kho cov neeg siv cov ntxhuav.

Task table thiab configuration files

Lub rooj ua haujlwm superuser nyob hauv /etc/crontab. Lub syntax ntawm lub system rooj sib haum mus rau lub syntax ntawm Vixie cron, tshwj tsis yog hais tias lub thib rau kab nyob rau hauv nws qhia lub npe ntawm tus neeg siv nyob rau hauv uas nws sawv cev rau txoj hauj lwm yog launched:

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

Cov neeg siv tsis tu ncua cov lus ua haujlwm nyob rau hauv /var/cron/tabs/username thiab siv tib syntax. Thaum koj khiav cov nqi hluav taws xob crontab raws li tus neeg siv, cov no yog cov ntaub ntawv uas raug kho.

Cov npe ntawm cov neeg siv nrog kev nkag mus rau crontab yog tswj hwm hauv /var/cron/pab thiab /var/cron/tsis lees paub cov ntaub ntawv, qhov twg koj tsuas yog yuav tsum tau nkag mus rau tus neeg siv lub npe hauv ib kab.

Extended syntax

Muab piv rau POSIX crontab, Paul Vixey cov kev daws teeb meem muaj ntau qhov kev hloov kho muaj txiaj ntsig zoo rau cov syntax ntawm cov khoom siv hluav taws xob cov lus ua haujlwm.

Ib lub rooj tshiab syntax tau dhau los: piv txwv li, koj tuaj yeem teev hnub ntawm lub lim tiam lossis lub hli los ntawm lub npe (Mon, Tue, thiab lwm yam):

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

Koj tuaj yeem qhia cov kauj ruam los ntawm cov haujlwm uas tau pib:

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

Cov kauj ruam thiab ntu tuaj yeem sib xyaw:

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

Intuitive lwm txoj kev rau cov syntax ib txwm tau txais kev txhawb nqa (rov pib dua, txhua xyoo, txhua xyoo, txhua hli, txhua lub lim tiam, txhua hnub, ib tag hmo, teev):

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

Kev ua haujlwm ib puag ncig

Vixie cron tso cai rau koj hloov ib puag ncig ntawm kev khiav haujlwm.

Cov kev hloov pauv ib puag ncig USER, LOGNAME thiab HOME tsis yog tsuas yog muab los ntawm daemon, tab sis raug coj los ntawm cov ntaub ntawv passwd. Qhov sib txawv ntawm PATH yog teem rau "/ usr / bin: / bin" thiab SHELL sib txawv yog teem rau "/bin/sh". Cov txiaj ntsig ntawm txhua qhov sib txawv tshwj tsis yog LOGNAME tuaj yeem hloov pauv hauv cov neeg siv cov ntxhuav.

Qee qhov kev hloov pauv ib puag ncig (feem ntau yog SHELL thiab HOME) yog siv los ntawm cron nws tus kheej los ua haujlwm. Nov yog dab tsi siv bash es tsis txhob tus qauv sh los khiav kev cai ua haujlwm yuav zoo li:

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

Thaum kawg, txhua qhov kev hloov pauv ib puag ncig tau teev tseg hauv lub rooj (siv los ntawm cron lossis xav tau los ntawm cov txheej txheem) yuav raug xa mus rau txoj haujlwm khiav.

Txhawm rau hloov cov ntaub ntawv, crontab siv tus editor teev tseg hauv VISUAL lossis EDITOR ib puag ncig hloov pauv. Yog tias ib puag ncig uas crontab tau khiav tsis muaj cov kev hloov pauv no, ces "/usr/ucb/vi" yog siv (ucb yog tej zaum University of California, Berkeley).

cron ntawm Debian thiab Ubuntu

Cov neeg tsim khoom ntawm Debian thiab cov khoom faib tawm tau tso tawm hloov kho heev version Vixie cron version 3.0pl1. Tsis muaj qhov sib txawv ntawm cov syntax ntawm cov ntaub ntawv rooj; rau cov neeg siv nws yog tib yam Vixie cron. Qhov Zoo Tshaj Plaws Tshiab: Txhawb syslog, SELinux и PAM.

Tsis tshua pom, tab sis cov kev hloov pauv tau suav nrog qhov chaw ntawm cov ntaub ntawv teeb tsa thiab cov rooj ua haujlwm.

Cov neeg siv cov ntxhuav hauv Debian nyob hauv /var/spool/cron/crontabs directory, cov lus system tseem nyob ntawd - hauv /etc/crontab. Debian pob-cov rooj ua haujlwm tshwj xeeb tau muab tso rau hauv /etc/cron.d, los ntawm qhov twg cron daemon tau nyeem lawv. Tus neeg siv nkag mus tswj yog tswj los ntawm /etc/cron.allow thiab /etc/cron.deny cov ntaub ntawv.

Lub plhaub qub tseem yog /bin / sh, uas hauv Debian yog lub plhaub me me POSIX-raws li khiav ceev, launched yam tsis tau nyeem tej configuration (nyob rau hauv non-interactive hom).

Cron nws tus kheej nyob rau hauv qhov tseeb versions ntawm Debian yog launched ntawm systemd, thiab lub community launch configuration tuaj yeem pom hauv /lib/systemd/system/cron.service. Tsis muaj ib yam dab tsi tshwj xeeb hauv kev pabcuam kev teeb tsa; kev tswj hwm kev ua haujlwm yooj yim dua tuaj yeem ua tiav los ntawm ib puag ncig hloov pauv tau tshaj tawm ncaj qha hauv crontab ntawm txhua tus neeg siv.

cronie ntawm RedHat, Fedora thiab CentOS

cronie - diav rawg ntawm Vixie cron version 4.1. Raws li hauv Debian, cov syntax tsis tau hloov pauv, tab sis kev txhawb nqa rau PAM thiab SELinux, ua haujlwm hauv pawg, taug qab cov ntaub ntawv siv inotify thiab lwm yam nta tau ntxiv.

Lub neej ntawd configuration yog nyob rau hauv ib txwm qhov chaw: lub system rooj nyob rau hauv /etc/crontab, tej pob khoom muab lawv cov ntxhuav nyob rau hauv /etc/cron.d, cov neeg siv cov ntxhuav mus rau hauv /var/spool/cron/crontabs.

Lub daemon khiav hauv kev tswj hwm kev tswj hwm, qhov kev pabcuam teeb tsa yog /lib/systemd/system/crond.service.

Ntawm Red Hat-zoo li kev faib tawm, /bin / sh yog siv los ntawm lub neej ntawd thaum pib, uas yog tus qauv bash. Nws yuav tsum raug sau tseg tias thaum ua haujlwm cron ntawm /bin / sh, lub plhaub bash pib hauv POSIX-raws li hom thiab tsis nyeem ib qho kev teeb tsa ntxiv, khiav hauv hom tsis sib tham.

cronie hauv SLES thiab openSUSE

Lub German faib SLES thiab nws cov derivative openSUSE siv tib cronie. Lub daemon ntawm no kuj tau pib nyob rau hauv systemd, qhov kev pab cuam teeb tsa nyob rau hauv /usr/lib/systemd/system/cron.service. Configuration: /etc/crontab, /etc/cron.d, /var/spool/cron/tabs. /bin/sh yog tib yam bash khiav hauv POSIX-raws li hom tsis sib tham.

Vixie cron ntaus ntawv

Cov xeeb leej xeeb ntxwv niaj hnub ntawm cron tsis tau hloov pauv radically piv rau Vixie cron, tab sis tseem tau txais cov yam ntxwv tshiab uas tsis tas yuav nkag siab cov ntsiab lus ntawm qhov kev zov me nyuam. Ntau qhov kev txuas ntxiv no tsis zoo tsim thiab tsis meej pem cov cai. Tus thawj cron qhov chaws los ntawm Paul Vixey yog qhov txaus siab nyeem.

Yog li ntawd, kuv txiav txim siab los tshuaj xyuas cov cuab yeej cron siv cov piv txwv ntawm cov kev pab cuam cron uas muaj rau ob ceg ntawm txoj kev loj hlob - Vixie cron 3.0pl1. Kuv yuav ua kom yooj yim cov piv txwv los ntawm kev tshem tawm ifdefs uas nyuaj rau kev nyeem ntawv thiab tshem tawm cov ntsiab lus me.

Kev ua haujlwm ntawm dab tuaj yeem muab faib ua ob peb theem:

  1. Pib qhov kev pab cuam.
  2. Sau thiab hloov kho cov npe ntawm cov haujlwm ua haujlwm.
  3. Main cron loop khiav.
  4. Pib ua haujlwm.

Cia peb saib lawv nyob rau hauv kev txiav txim.

Kev pib ua

Thaum pib, tom qab kuaj xyuas cov txheej txheem sib cav, cron teeb tsa SIGCHLD thiab SIGHUP teeb liab handlers. Thawj qhov ua rau lub cav nkag txog qhov kev txiav tawm ntawm tus menyuam txheej txheem, qhov thib ob yog kaw cov ntaub ntawv piav qhia ntawm cov ntaub ntawv teev cia:

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

Lub cron daemon ib txwm khiav ib leeg ntawm lub kaw lus, tsuas yog ua tus superuser thiab los ntawm cov npe loj cron. Cov kev hu hauv qab no tsim cov ntaub ntawv xauv nrog PID ntawm cov txheej txheem daemon, xyuas kom meej tias tus neeg siv raug thiab hloov cov npe tam sim no mus rau qhov tseem ceeb:

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

Txoj kev default tau teeb tsa, uas yuav raug siv thaum pib cov txheej txheem:

setenv("PATH", _PATH_DEFPATH, 1);

Ces tus txheej txheem yog "daemonized": nws tsim ib tug me nyuam daim qauv ntawm tus txheej txheem los ntawm kev hu rau rab rawg thiab ib tug tshiab kev sib kho nyob rau hauv tus txheej txheem ntawm tus me nyuam (hu rau setsid). Cov txheej txheem niam txiv tsis xav tau lawm, thiab nws tawm:

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

Kev txiav tawm ntawm cov txheej txheem niam txiv tso lub xauv ntawm cov ntaub ntawv xauv. Tsis tas li ntawd, nws yuav tsum tau hloov kho PID hauv cov ntaub ntawv rau tus menyuam. Tom qab ntawd, cov ntaub ntawv ua haujlwm tau sau rau hauv:

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

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

Tom qab ntawd cron txav mus rau lub voj voog ua haujlwm tseem ceeb. Tab sis ua ntej ntawd, nws tsim nyog ua tib zoo saib ntawm kev thauj cov npe ua haujlwm.

Sau thiab hloov kho cov npe ua haujlwm

Lub load_database muaj nuj nqi yog lub luag haujlwm rau thauj cov npe ntawm cov haujlwm. Nws xyuas lub ntsiab system crontab thiab cov npe nrog cov neeg siv cov ntaub ntawv. Yog tias cov ntaub ntawv thiab cov npe tsis tau hloov pauv, daim ntawv teev cov haujlwm yuav tsis rov nyeem dua. Txwv tsis pub, ib daim ntawv teev cov haujlwm tshiab pib tsim.

Loading a system file nrog cov ntaub ntawv tshwj xeeb thiab cov npe ntawm lub rooj:

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

Loading user tables nyob rau hauv ib lub voj:

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

Tom qab ntawd cov ntaub ntawv qub tau hloov nrog ib qho tshiab.

Hauv cov piv txwv saum toj no, process_crontab muaj nuj nqi hu xov tooj xyuas tias tus neeg siv sib piv cov ntaub ntawv lub npe muaj nyob (tshwj tsis yog nws yog superuser) thiab tom qab ntawd hu rau load_user. Lub tom kawg twb nyeem cov ntaub ntawv nws tus kheej kab los ntawm kab:

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

Ntawm no, ob qho tib si ib puag ncig hloov pauv tau teeb tsa (kab ntawm daim ntawv VAR = tus nqi) siv cov haujlwm load_env / env_set, lossis cov lus piav qhia ua haujlwm tau nyeem (* * * * * /path/to/exec) siv cov haujlwm load_entry.

Lub chaw nkag uas load_entry rov qab yog peb txoj haujlwm, uas tau muab tso rau hauv cov npe ntawm cov haujlwm. Qhov kev ua haujlwm nws tus kheej ua tawm qhov kev sib piv ntawm lub sijhawm, tab sis peb xav paub ntau ntxiv txog kev tsim cov kev hloov pauv ib puag ncig thiab cov haujlwm tso tawm tsis ua haujlwm:

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

Lub voj tseem ceeb ua haujlwm nrog cov npe ntawm cov haujlwm tam sim no.

Main voj

Thawj cron los ntawm Version 7 Unix ua haujlwm yooj yim heev: nws rov nyeem qhov teeb tsa hauv lub voj voog, pib ua haujlwm ntawm feeb tam sim no ua tus superuser, thiab pw kom txog thaum pib ntawm feeb tom ntej. Txoj hauv kev yooj yim no ntawm cov tshuab qub yuav tsum tau siv ntau dhau.

Ib qho kev hloov tshiab tau npaj rau hauv SysV, uas tus daemon tau pw tsaug zog mus txog rau lub sijhawm ze tshaj plaws uas lub luag haujlwm tau hais tseg, lossis rau 30 feeb. Cov peev txheej tsawg dua tau siv rau rov nyeem cov teeb tsa thiab tshuaj xyuas cov haujlwm hauv hom no, tab sis hloov kho cov npe ntawm cov haujlwm sai sai ua tsis yooj yim.

Vixie cron rov qab mus kuaj cov npe ua haujlwm ib zaug ib feeb, hmoov zoo los ntawm qhov kawg ntawm 80s muaj cov peev txheej ntau ntxiv ntawm cov tshuab Unix txheem:

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

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

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

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

Lub cron_sleep muaj nuj nqi yog koom ncaj qha rau hauv kev ua haujlwm, hu rau job_runqueue (numerate thiab khiav haujlwm) thiab do_command (khiav txhua tus neeg ua haujlwm) ua haujlwm. Lub luag haujlwm kawg yog tsim nyog kuaj xyuas kom meej ntxiv.

Ua haujlwm

Lub do_command muaj nuj nqi tau ua tiav hauv Unix style zoo, uas yog, nws ua rab rawg los ua haujlwm asynchronously. Cov txheej txheem niam txiv tseem tab tom pib ua haujlwm, cov txheej txheem menyuam yaus npaj cov txheej txheem ua haujlwm:

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

Muaj ntau lub logic hauv child_process: nws lees txais cov qauv tsim tawm thiab cov kev ua yuam kev, tom qab ntawd xa lawv mus rau xa ntawv (yog tias MAILTO ib puag ncig hloov pauv tau teev tseg hauv cov lus ua haujlwm), thiab, thaum kawg, tos rau cov txheej txheem tseem ceeb ntawm txoj haujlwm. ua kom tiav.

Cov txheej txheem ua haujlwm yog tsim los ntawm lwm tus diav rawg:

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

Qhov ntawd yog txhua yam cron yog. Kuv tshem tawm qee cov ntsiab lus nthuav dav, piv txwv li, accounting rau cov neeg siv nyob deb, tab sis kuv tau piav qhia qhov tseem ceeb.

Tom qab ntawd

Cron yog qhov kev pabcuam yooj yim thiab muaj txiaj ntsig zoo, ua hauv cov kab ke zoo tshaj plaws ntawm Unix ntiaj teb. Nws tsis ua dab tsi ntxiv, tab sis nws tau ua nws txoj haujlwm zoo kawg nkaus rau ntau xyoo tam sim no. Tau txais los ntawm cov cai rau lub version uas los nrog Ubuntu siv tsis pub dhau ib teev, thiab kuv muaj kev lom zem heev! Kuv vam tias kuv tuaj yeem qhia rau koj.

Kuv tsis paub txog koj, tab sis kuv tu siab me ntsis kom paub tias kev ua haujlwm niaj hnub no, nrog rau nws txoj kev xav kom nyuaj thiab dhau-abstract, tsis tau ua kom yooj yim rau lub sijhawm ntev.

Muaj ntau ntau txoj hauv kev niaj hnub no rau cron: systemd-timers tso cai rau koj los npaj cov txheej txheem nyuaj nrog kev vam khom, fcron tso cai rau koj kom tswj tau cov peev txheej ntau dua los ntawm kev ua haujlwm. Tab sis tus kheej, qhov yooj yim crontab yeej ib txwm txaus rau kuv.

Hauv luv luv, hlub Unix, siv cov kev pab cuam yooj yim thiab tsis txhob hnov ​​​​qab nyeem cov mana rau koj lub platform!

Tau qhov twg los: www.hab.com

Ntxiv ib saib