Cron mu Linux: mbiri, ntchito ndi chipangizo

Cron mu Linux: mbiri, ntchito ndi chipangizo

The tingachipeze powerenga analemba kuti osangalala maola saonera. Munthawi zakutchire kunalibe opanga mapulogalamu kapena Unix, koma masiku ano opanga mapulogalamu amadziwa motsimikiza: cron azisunga nthawi m'malo mwa iwo.

Zothandizira pamzere wamalamulo ndizofooka komanso zantchito kwa ine. sed, awk, wc, cut ndi mapulogalamu ena akale amayendetsedwa ndi zolemba pamaseva athu tsiku lililonse. Ambiri aiwo adapangidwa ngati ntchito za cron, wokonza mapulani kuyambira 70s.

Kwa nthawi yayitali ndimagwiritsa ntchito cron mwachiphamaso, osalowa mwatsatanetsatane, koma tsiku lina, nditakumana ndi cholakwika polemba script, ndinaganiza zoyang'ana bwino. Umu ndi momwe nkhaniyi idawonekera, ndikuyilemba ndidazolowera POSIX crontab, zosankha zazikulu za cron pamagawidwe otchuka a Linux ndi kapangidwe ka ena mwa iwo.

Kodi mukugwiritsa ntchito Linux ndikuyendetsa ntchito za cron? Kodi mumakonda kamangidwe ka ntchito ku Unix? Ndiye tili mnjira!

Zamkatimu

Chiyambi cha mitundu

Kugwiritsa ntchito nthawi ndi nthawi kwa mapulogalamu a ogwiritsa ntchito kapena dongosolo ndikofunikira kwambiri pamakina onse ogwiritsira ntchito. Chifukwa chake, opanga mapulogalamu adazindikira kufunikira kwa ntchito zomwe zimawalola kukonzekera ndikuchita ntchito kalekale.

Makina opangira ma Unix amatengera komwe adachokera ku Version 7 Unix, yomwe idapangidwa muzaka za 70s zazaka zapitazi ku Bell Labs, kuphatikiza ndi Ken Thompson wotchuka. Version 7 Unix idaphatikizansopo cron, ntchito yoyendetsa ntchito za superuser pafupipafupi.

Cron yamakono yamakono ndi pulogalamu yosavuta, koma ndondomeko yogwiritsira ntchito mtundu woyambirira inali yosavuta: ntchitoyo imadzuka kamodzi pa mphindi imodzi, kuwerenga tebulo ndi ntchito kuchokera pa fayilo imodzi (/etc/lib/crontab) ndikuchita superuser ntchito zomwe zimayenera kuchitidwa pakali pano.

Pambuyo pake, mitundu yabwino ya ntchito yosavuta komanso yothandiza idaperekedwa ndi makina onse opangira Unix.

Mafotokozedwe amtundu wa crontab ndi mfundo zoyambira zogwirira ntchito zidaphatikizidwa muyeso yayikulu yamakina ogwiritsira ntchito a Unix - POSIX - mu 1992, motero cron kuchokera ku de facto standard idakhala mulingo wa de jure.

Mu 1987, Paul Vixie, atafufuza ogwiritsa ntchito a Unix za zofuna zawo za cron, adatulutsa mtundu wina wa daemon womwe unakonza mavuto ena a chikhalidwe cha cron ndikukulitsa mawu a mafayilo a tebulo.

Ndi mtundu wachitatu wa Vixie cron adayamba kukwaniritsa zofunikira za POSIX, kuwonjezera apo, pulogalamuyi inali ndi chilolezo chololera, kapena m'malo mwake panalibe chilolezo konse, kupatula zofuna za README: wolemba sapereka zitsimikizo, dzina la wolemba. sichingachotsedwe, ndipo pulogalamuyo ikhoza kugulitsidwa pamodzi ndi code code. Zofunikira izi zidakhala zogwirizana ndi mfundo zamapulogalamu aulere omwe anali kutchuka m'zaka zimenezo, kotero magawo ena ofunikira a Linux omwe adawonekera koyambirira kwa 90s adatenga Vixie cron ngati dongosolo lawo limodzi ndipo akulipangabe mpaka pano.

Makamaka, Red Hat ndi SUSE amapanga foloko ya Vixie cron - cronie, ndipo Debian ndi Ubuntu amagwiritsa ntchito Vixie cron yoyambirira yokhala ndi zigamba zambiri.

Tiyeni tidziwe kaye za ogwiritsa ntchito crontab omwe afotokozedwa mu POSIX, pambuyo pake tiwona zowonjezera za syntax zomwe zaperekedwa ku Vixie cron komanso kugwiritsa ntchito mitundu yosiyanasiyana ya Vixie cron pamagawidwe otchuka a Linux. Ndipo potsiriza, chitumbuwa pa keke ndikuwunika kwa chipangizo cha cron daemon.

POSIX crontab

Ngati cron yoyambirira imagwira ntchito kwa superuser nthawi zonse, okonza masiku ano nthawi zambiri amakumana ndi ntchito za ogwiritsa ntchito wamba, zomwe zimakhala zotetezeka komanso zosavuta.

Crons amaperekedwa ngati mapulogalamu awiri: cron daemon yomwe ikuyenda nthawi zonse ndi crontab utility yomwe ikupezeka kwa ogwiritsa ntchito. Chotsatiracho chimakulolani kuti musinthe matebulo a ntchito kwa aliyense wogwiritsa ntchito, pamene daemon imayambitsa ntchito kuchokera ku matebulo ogwiritsira ntchito ndi machitidwe.

В POSIX muyezo khalidwe la daemon silinafotokozedwe mwanjira iliyonse ndipo pulogalamu yokhayo yogwiritsira ntchito ndiyokhazikika crontab. Kukhalapo kwa njira zoyambira ntchito za ogwiritsa ntchito ndikoyenera, koma sikufotokozedwa mwatsatanetsatane.

Poyitanitsa crontab utility, mutha kuchita zinthu zinayi: sinthani tebulo lantchito la wogwiritsa ntchito mumkonzi, kutsitsa tebulo kuchokera pafayilo, kuwonetsa tebulo lantchito lomwe lilipo, ndikuchotsa tebulo lantchito. Zitsanzo za momwe ntchito ya crontab imagwirira ntchito:

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

Poyimba crontab -e mkonzi wotchulidwa muzosintha zokhazikika zidzagwiritsidwa ntchito EDITOR.

Ntchitozo zikufotokozedwa motere:

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

Minda isanu yoyambirira ya zolemba: mphindi [1..60], maola [0..23], masiku a mwezi [1..31], miyezi [1..12], masiku a sabata [0. .6], pomwe 0 ndi Lamlungu. Gawo lomaliza, lachisanu ndi chimodzi, ndi mzere womwe udzachitidwa ndi womasulira wokhazikika.

M'magawo asanu oyamba, zikhalidwe zitha kulembedwa zolekanitsidwa ndi ma comma:

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

Kapena ndi hyphen:

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

Kufikira kwa ogwiritsira ntchito ndandanda ya ntchito kumayendetsedwa mu POSIX ndi mafayilo a cron.allow ndi cron.deny, omwe amalemba olemba omwe ali ndi mwayi wopita ku crontab ndi ogwiritsa ntchito opanda pulogalamu, motsatira. Muyezowu suyang'anira malo a mafayilowa mwanjira iliyonse.

Malinga ndi muyezo, zosachepera zinayi zamitundu yosiyanasiyana ziyenera kuperekedwa kumapulogalamu omwe akhazikitsidwa:

  1. HOME - chikwatu chakunyumba kwa ogwiritsa ntchito.
  2. LOGNAME - kulowa kwa ogwiritsa ntchito.
  3. PATH ndiye njira yomwe mungapezere zida zokhazikika pamakina.
  4. SHELL - njira yopita ku womasulira wogwiritsa ntchito.

Makamaka, POSIX sanena kalikonse za komwe zikhalidwe zamitundu iyi zimachokera.

Wogulitsa kwambiri - Vixie cron 3.0pl1

Kholo wamba wamitundu yodziwika bwino ya cron ndi Vixie cron 3.0pl1, yomwe idayambitsidwa pamndandanda wamakalata wa comp.sources.unix mu 1992. Tikambirana mbali zazikulu za Baibuloli mwatsatanetsatane.

Vixie cron imabwera m'mapulogalamu awiri (cron ndi crontab). Monga mwachizolowezi, daemon imayang'anira kuwerenga ndikuyendetsa ntchito kuchokera patebulo lantchito yadongosolo ndi matebulo ogwiritsira ntchito aliyense payekha, ndipo crontab utility imayang'anira kukonza matebulo ogwiritsa ntchito.

Task table ndi mafayilo osinthira

Gome la ntchito ya superuser lili mu /etc/crontab. Mawu a tebulo la dongosolo amafanana ndi mawu a Vixie cron, kupatulapo kuti gawo lachisanu ndi chimodzi mmenemo limasonyeza dzina la wogwiritsa ntchito yemwe ntchitoyo imayambitsidwa:

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

Matebulo ogwiritsira ntchito nthawi zonse amakhala /var/cron/tabs/username ndipo amagwiritsa ntchito mawu ofanana. Mukayendetsa ntchito ya crontab ngati wosuta, awa ndi mafayilo omwe amasinthidwa.

Mndandanda wa ogwiritsa ntchito omwe ali ndi mwayi wopita ku crontab amayendetsedwa mu / var / cron / kulola ndi / var / cron / kukana mafayilo, kumene mumangofunika kulowetsa dzina la ogwiritsira ntchito mzere wosiyana.

Syntax yowonjezera

Poyerekeza ndi POSIX crontab, yankho la Paul Vixey lili ndi zosintha zingapo zothandiza kwambiri pamasinthidwe amatebulo antchito.

Mawu atsopano a tebulo apezeka: mwachitsanzo, mutha kutchula masiku a sabata kapena miyezi ndi dzina (Lolemba, Lachiwiri, ndi zina zotero):

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

Mutha kufotokozera momwe ntchito zimayambira:

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

Masitepe ndi intervals akhoza kusakanikirana:

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

Njira zodziwikiratu za mawu anthawi zonse zimathandizidwa (kuyambiranso, chaka, chaka, mwezi uliwonse, mlungu uliwonse, tsiku lililonse, pakati pausiku, ola lililonse):

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

Malo ogwirira ntchito

Vixie cron imakulolani kuti musinthe malo ogwiritsira ntchito mapulogalamu.

Zosintha zachilengedwe USER, LOGNAME ndi HOME sizinangoperekedwa ndi daemon, koma zimachotsedwa mufayilo. passwd. Kusiyana kwa PATH kumayikidwa ku "/usr/bin:/bin" ndipo SHELL yosinthika imayikidwa ku "/bin/sh". Makhalidwe amitundu yonse kupatula LOGNAME amatha kusinthidwa pamatebulo ogwiritsa ntchito.

Zosintha zina zachilengedwe (makamaka SHELL ndi HOME) zimagwiritsidwa ntchito ndi cron palokha kuyendetsa ntchitoyi. Izi ndi zomwe kugwiritsa ntchito bash m'malo mwa sh wokhazikika kuyendetsa ntchito zomwe zingawonekere:

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

Pamapeto pake, zosintha zonse za chilengedwe zomwe zafotokozedwa patebulo (zogwiritsidwa ntchito ndi cron kapena zofunikira ndi ndondomekoyi) zidzaperekedwa ku ntchito yoyendetsa.

Kuti musinthe mafayilo, crontab imagwiritsa ntchito mkonzi wotchulidwa mu VISUAL kapena EDITOR chilengedwe variable. Ngati malo omwe crontab amayendetsedwa alibe zosinthika izi, ndiye kuti "/usr/ucb/vi" imagwiritsidwa ntchito (ucb mwina ndi University of California, Berkeley).

cron pa Debian ndi Ubuntu

Madivelopa a Debian ndi zotumphukira zogawa zatulutsidwa kwambiri kusinthidwa Baibulo Mtundu wa Vixie cron 3.0pl1. Palibe kusiyana mu syntax ya mafayilo a tebulo; kwa ogwiritsa ntchito ndi Vixie cron yemweyo. Chatsopano Chachikulu Kwambiri: Thandizo syslog, SELinux и PAM.

Zosawoneka bwino, koma zosintha zowoneka bwino zimaphatikizapo malo a mafayilo osinthira ndi matebulo antchito.

Matebulo ogwiritsa ntchito mu Debian ali mu /var/spool/cron/crontabs directory, tebulo ladongosolo likadalipo - mu /etc/crontab. Matebulo amtundu wa Debian amayikidwa mu /etc/cron.d, pomwe cron daemon amawawerengera okha. Kuwongolera kwa ogwiritsa ntchito kumayendetsedwa ndi mafayilo /etc/cron.allow ndi /etc/cron.deny.

Chigoba chosasinthika chikadali /bin/sh, chomwe mu Debian ndi chipolopolo chaching'ono chogwirizana ndi POSIX mukapeza, idayambitsidwa osawerenga kasinthidwe kalikonse (munjira yosagwirizana).

Cron yokha m'mawonekedwe aposachedwa a Debian imayambitsidwa kudzera pa systemd, ndipo kasinthidwe kake katha kuwonedwa mu /lib/systemd/system/cron.service. Palibe chapadera pamasinthidwe autumiki; kasamalidwe kena kake kosawoneka bwino katha kuchitika kudzera mumitundu yosiyanasiyana yomwe imalengezedwa mwachindunji mu crontab ya wogwiritsa ntchito aliyense.

cronie pa RedHat, Fedora ndi CentOS

cronie - foloko ya mtundu wa Vixie cron 4.1. Monga mu Debian, mawuwo sanasinthe, koma kuthandizira PAM ndi SELinux, kugwira ntchito m'magulu, kufufuza mafayilo pogwiritsa ntchito inotify ndi zina zawonjezedwa.

Kukonzekera kosasintha kuli m'malo omwe nthawi zonse: tebulo ladongosolo liri mu /etc/crontab, maphukusi amaika matebulo awo /etc/cron.d, matebulo ogwiritsira ntchito amalowa /var/spool/cron/crontabs.

Daemon imayenda pansi pa systemd control, kasinthidwe ka ntchito ndi /lib/systemd/system/crond.service.

Pa zogawira ngati Red Hat, /bin/sh imagwiritsidwa ntchito poyambira, yomwe ndi bash wamba. Zindikirani kuti poyendetsa ntchito za cron kudzera / bin/sh, chipolopolo cha bash chimayamba mu POSIX-compliant mode ndipo sichiwerenga kasinthidwe kowonjezera, kamene kakuyenda mosagwirizana.

cronie mu SLES ndi openSUSE

Kugawa kwa Germany SLES ndi zotuluka zake OpenSUSE amagwiritsa ntchito cronie yomweyo. Daemon pano idakhazikitsidwanso pansi pa systemd, kasinthidwe kantchito kali mkati /usr/lib/systemd/system/cron.service. Kukonzekera: /etc/crontab, /etc/cron.d, /var/spool/cron/tabs. /bin/sh ndi bash yomweyo yomwe ikuyenda mu POSIX-yosagwirizana ndi njira yosagwirizana.

Chida cha Vixie cron

Ana amakono a cron sanasinthe kwambiri poyerekeza ndi Vixie cron, komabe adapeza zinthu zatsopano zomwe sizikufunika kumvetsetsa mfundo za pulogalamuyi. Zambiri mwazowonjezerazi sizinapangidwe bwino ndipo zimasokoneza ma code. Khodi yoyambirira ya cron yolembedwa ndi Paul Vixey ndiyosangalatsa kuwerenga.

Chifukwa chake, ndinaganiza zosanthula chipangizo cha cron pogwiritsa ntchito chitsanzo cha pulogalamu ya cron yodziwika ku nthambi zonse zachitukuko - Vixie cron 3.0pl1. Ndifewetsa zitsanzozo pochotsa ifdefs zomwe zimasokoneza kuwerenga ndikusiya zing'onozing'ono.

Ntchito ya chiwanda ikhoza kugawidwa m'magawo angapo:

  1. Kuyambitsa pulogalamu.
  2. Kusonkhanitsa ndi kukonzanso mndandanda wa ntchito zomwe zikuyenera kuchitika.
  3. Main cron loop ikuyenda.
  4. Yambani ntchito.

Tiyeni tiyang'ane pa iwo mu dongosolo.

Kuyambitsa

Ikayambika, mutatha kuyang'ana ndondomekoyi, cron imayika SIGCHLD ndi SIGHUP zizindikiro zogwira ntchito. Woyamba amalowetsa chipika chokhudza kutha kwa mwana, wachiwiri amatseka fayilo yofotokozera za fayilo ya chipika:

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

Daemon ya cron nthawi zonse imayenda yokha padongosolo, kokha ngati superuser komanso kuchokera ku cron directory. Mafoni otsatirawa amapanga fayilo yotseka ndi PID ya ndondomeko ya daemon, onetsetsani kuti wogwiritsa ntchitoyo ndi wolondola ndikusintha chikwatu chomwe chilipo kuti chikhale chachikulu:

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

Njira yokhazikika yakhazikitsidwa, yomwe idzagwiritsidwe ntchito poyambitsa njira:

setenv("PATH", _PATH_DEFPATH, 1);

Ndiye ndondomekoyi ndi "daemonized": imapanga chithunzi cha mwana cha ndondomekoyi poyitana foloko ndi gawo latsopano mu ndondomeko ya mwana (kuitana setsid). Njira ya makolo sikufunikanso, ndipo imatuluka:

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

Kuthetsa njira ya makolo kumatulutsa loko pafayilo ya loko. Kuphatikiza apo, ndikofunikira kusinthira PID mufayilo kwa mwana. Pambuyo pake, database ya ntchito imadzazidwa ndi:

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

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

Kenako cron amapitilira kumayendedwe akulu a ntchito. Koma izi zisanachitike, ndikofunikira kuyang'ana pakukweza mndandanda wantchito.

Kusonkhanitsa ndi kukonzanso mndandanda wa ntchito

Ntchito ya load_database ili ndi udindo wokweza mndandanda wa ntchito. Imayang'ana dongosolo lalikulu la crontab ndi chikwatu chokhala ndi mafayilo ogwiritsa ntchito. Ngati mafayilo ndi chikwatu sichinasinthe, mndandanda wa ntchito suwerengedwanso. Apo ayi, mndandanda watsopano wa ntchito umayamba kupanga.

Kutsegula fayilo yokhala ndi mafayilo apadera ndi mayina atebulo:

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

Kutsegula matebulo a ogwiritsa ntchito mu lupu:

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

Pambuyo pake database yakale imasinthidwa ndi yatsopano.

Muzitsanzo pamwambapa, kuyimba kwa process_crontab kumatsimikizira kuti wogwiritsa ntchito wofanana ndi dzina la fayilo alipo (pokhapokha ngati ali wamkulu) ndiyeno amatcha load_user. Womaliza amawerenga kale fayiloyo pamzere ndi mzere:

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

Apa, mwina kusintha kwa chilengedwe kumayikidwa (mizere ya mawonekedwe a VAR=value) pogwiritsa ntchito load_env / env_set ntchito, kapena kufotokozera ntchito kumawerengedwa (* * * * * /path/to/exec) pogwiritsa ntchito load_entry function.

Cholowa chomwe load_entry chimabwerera ndi ntchito yathu, yomwe imayikidwa pamndandanda wantchito. Ntchitoyo yokhayo imachita verbose parsing ya nthawi, koma tili ndi chidwi kwambiri ndi mapangidwe achilengedwe ndi magawo oyambitsa ntchito:

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

Lupu yayikulu imagwira ntchito ndi mndandanda wapano wa ntchito.

Main Loop

Cron yoyambirira yochokera ku Version 7 Unix idagwira ntchito mophweka: idawerenganso kasinthidwe mu chipika, idayambitsa ntchito za mphindi yapano ngati superuser, ndikugona mpaka kuyamba kwa mphindi yotsatira. Njira yosavuta imeneyi pamakina akale inkafuna zinthu zambiri.

Mtundu wina udaperekedwa ku SysV, momwe daemon adagona mpaka mphindi yapafupi yomwe ntchitoyi idafotokozedwera, kapena kwa mphindi 30. Zida zochepa zidagwiritsidwa ntchito powerenganso kasinthidwe ndi kuyang'ana ntchito mwanjira iyi, koma kukonzanso mwachangu mndandanda wa ntchito kunakhala kovutirapo.

Vixie cron adabwereranso kukawona mindandanda yantchito kamodzi pa mphindi, mwamwayi pofika kumapeto kwa zaka za m'ma 80 panali zochulukirapo pamakina amtundu wa 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;
}

Ntchito ya cron_sleep imakhudzidwa mwachindunji ndikuchita ntchito, kuyitana job_runqueue (kuwerengera ndi kuyendetsa ntchito) ndi do_command (kuyendetsa ntchito iliyonse). Ntchito yomaliza ndiyofunika kufufuza mwatsatanetsatane.

Kugwira ntchito

Ntchito ya do_command imachitidwa mwanjira yabwino ya Unix, ndiye kuti, imapanga foloko kuti igwire ntchitoyo mosagwirizana. Ndondomeko ya makolo ikupitiriza kuyambitsa ntchito, ndondomeko ya mwana imakonzekera ntchitoyo:

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

Pali malingaliro ambiri mu child_process: zimatengera kutulutsa kokhazikika ndi zolakwika payokha, kuti mutumize kumakalata (ngati kusinthika kwachilengedwe kwa MAILTO kwafotokozedwa patebulo la ntchito), ndipo, pomaliza, kudikirira chachikulu. ntchito yomaliza.

Ntchitoyi imapangidwa ndi foloko ina:

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

Ndizo zonse zomwe cron ali. Ndinasiya zina zosangalatsa, mwachitsanzo, kuwerengera kwa ogwiritsa ntchito akutali, koma ndinalongosola chinthu chachikulu.

Pambuyo pake

Cron ndi pulogalamu yosavuta komanso yothandiza, yopangidwa m'miyambo yabwino kwambiri ya Unix. Sachita chilichonse chowonjezera, koma wakhala akuchita ntchito yake modabwitsa kwa zaka makumi angapo tsopano. Kupeza ma code a mtundu womwe umabwera ndi Ubuntu sikunatenge kupitilira ola limodzi, ndipo ndidasangalala kwambiri! Ndikukhulupirira kuti ndatha kugawana nanu.

Sindikudziwa za inu, koma ndine wachisoni pang'ono kuzindikira kuti mapulogalamu amakono, ndi chizolowezi chake chovuta kwambiri komanso chodziwika bwino, sichinapangitse kuphweka koteroko kwa nthawi yaitali.

Pali njira zambiri zamakono zosinthira cron: ma systemd-timers amakulolani kuti mukonzekere machitidwe ovuta omwe ali ndi zodalira, fcron imakulolani kuti muzitha kuwongolera kugwiritsa ntchito zida ndi ntchito. Koma panokha, crontab yosavuta nthawi zonse inali yokwanira kwa ine.

Mwachidule, kondani Unix, gwiritsani ntchito mapulogalamu osavuta ndipo musaiwale kuwerenga mana papulatifomu yanu!

Source: www.habr.com

Kuwonjezera ndemanga