Cron katika Linux: historia, matumizi na kifaa

Cron katika Linux: historia, matumizi na kifaa

The classic aliandika kwamba masaa furaha si kuangalia. Katika nyakati hizo za porini hapakuwa na waandaaji wa programu wala Unix, lakini leo waandaaji wa programu wanajua kwa hakika: cron itafuatilia wakati badala yao.

Huduma za mstari wa amri ni udhaifu na kazi kwangu. sed, awk, wc, kata na programu zingine za zamani zinaendeshwa na hati kwenye seva zetu kila siku. Nyingi zimeundwa kama kazi za cron, kipanga ratiba asilia kutoka miaka ya 70.

Kwa muda mrefu nilitumia cron juu juu, bila kuingia katika maelezo, lakini siku moja, nilipokutana na hitilafu wakati wa kuendesha script, niliamua kuiangalia vizuri. Hivi ndivyo nakala hii ilionekana, wakati wa kuiandika nilifahamu POSIX crontab, chaguzi kuu za cron katika usambazaji maarufu wa Linux na muundo wa baadhi yao.

Je! unatumia Linux na unaendesha kazi za cron? Je! unavutiwa na usanifu wa programu ya mfumo huko Unix? Kisha tuko njiani!

yaliyomo

Asili ya spishi

Utekelezaji wa mara kwa mara wa programu za mtumiaji au mfumo ni hitaji la wazi katika mifumo yote ya uendeshaji. Kwa hivyo, waandaaji wa programu waligundua hitaji la huduma zinazowaruhusu kupanga na kutekeleza majukumu muda mrefu uliopita.

Mifumo ya uendeshaji inayofanana na Unix hufuatilia asili yake hadi Toleo la 7 Unix, lililotengenezwa miaka ya 70 ya karne iliyopita huko Bell Labs, ikijumuisha na Ken Thompson maarufu. Toleo la 7 la Unix pia lilijumuisha cron, huduma ya kuendesha kazi za watumiaji wakuu mara kwa mara.

Cron ya kisasa ya kisasa ni programu rahisi, lakini algorithm ya uendeshaji ya toleo la asili ilikuwa rahisi zaidi: huduma iliamka mara moja kwa dakika, kusoma meza na kazi kutoka kwa faili moja (/etc/lib/crontab) na kutekelezwa kwa superuser kazi zile ambazo zilipaswa kufanywa kwa sasa.

Baadaye, matoleo yaliyoboreshwa ya huduma rahisi na muhimu yalitolewa na mifumo yote ya uendeshaji inayofanana na Unix.

Maelezo ya jumla ya muundo wa crontab na kanuni za msingi za uendeshaji wa shirika zilijumuishwa katika kiwango kikuu cha mifumo ya uendeshaji ya Unix - POSIX - mwaka wa 1992, na hivyo cron kutoka kwa kiwango cha de facto ikawa kiwango cha de jure.

Mnamo 1987, Paul Vixie, akiwa amechunguza watumiaji wa Unix juu ya matakwa yao ya cron, alitoa toleo lingine la daemon ambalo lilirekebisha shida kadhaa za cron ya kitamaduni na kupanua syntax ya faili za jedwali.

Kwa toleo la tatu la Vixie cron ilianza kukidhi mahitaji ya POSIX, kwa kuongeza, mpango huo ulikuwa na leseni ya huria, au tuseme hapakuwa na leseni kabisa, isipokuwa kwa matakwa katika README: mwandishi haitoi dhamana, jina la mwandishi. haiwezi kufutwa, na programu inaweza tu kuuzwa pamoja na msimbo wa chanzo. Mahitaji haya yaliendana na kanuni za programu ya bure ambayo ilikuwa ikipata umaarufu katika miaka hiyo, kwa hivyo baadhi ya usambazaji muhimu wa Linux ambao ulionekana mapema miaka ya 90 ulichukua Vixie cron kama mfumo wao wa kwanza na bado unaiendeleza hadi leo.

Hasa, Red Hat na SUSE hutengeneza uma wa Vixie cron - cronie, na Debian na Ubuntu hutumia toleo la asili la Vixie cron na viraka vingi.

Hebu kwanza tufahamiane na crontab ya matumizi ya mtumiaji iliyoelezwa katika POSIX, baada ya hapo tutaangalia upanuzi wa syntax uliotolewa katika Vixie cron na matumizi ya tofauti za Vixie cron katika usambazaji maarufu wa Linux. Na hatimaye, cherry kwenye keki ni uchambuzi wa kifaa cha cron daemon.

POSIX crontab

Ikiwa cron ya asili daima ilifanya kazi kwa superuser, wapangaji wa kisasa mara nyingi hushughulika na kazi za watumiaji wa kawaida, ambayo ni salama zaidi na rahisi.

Crons hutolewa kama seti ya programu mbili: cron daemon inayoendelea kila wakati na matumizi ya crontab inayopatikana kwa watumiaji. Mwisho hukuruhusu kuhariri majedwali ya kazi maalum kwa kila mtumiaji kwenye mfumo, wakati daemon inazindua kazi kutoka kwa meza za watumiaji na mfumo.

В Kiwango cha POSIX tabia ya daemon haijafafanuliwa kwa njia yoyote na ni programu ya mtumiaji pekee ndiyo iliyorasimishwa crontab. Uwepo wa mifumo ya kuzindua kazi za watumiaji, kwa kweli, ina maana, lakini haijaelezewa kwa undani.

Kwa kuita matumizi ya crontab, unaweza kufanya mambo manne: kuhariri jedwali la kazi la mtumiaji katika kihariri, pakia jedwali kutoka kwa faili, onyesha jedwali la kazi la sasa, na ufute jedwali la kazi. Mifano ya jinsi matumizi ya crontab inavyofanya kazi:

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

Akiitwa crontab -e kihariri kilichobainishwa katika utofauti wa kawaida wa mazingira kitatumika EDITOR.

Kazi zenyewe zimeelezewa katika muundo ufuatao:

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

Sehemu tano za kwanza za rekodi: dakika [1..60], masaa [0..23], siku za mwezi [1..31], miezi [1..12], siku za wiki [0. .6], ambapo 0 ni Jumapili. Sehemu ya mwisho, ya sita, ni mstari ambao utatekelezwa na mkalimani wa amri ya kawaida.

Katika sehemu tano za kwanza, maadili yanaweza kuorodheshwa yakitenganishwa na koma:

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

Au na hyphen:

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

Ufikiaji wa mtumiaji kwa upangaji kazi unadhibitiwa katika POSIX na faili za cron.allow na cron.deny, ambazo huorodhesha watumiaji wanaoweza kufikia crontab na watumiaji bila ufikiaji wa programu, mtawalia. Kiwango hakidhibiti eneo la faili hizi kwa njia yoyote.

Kulingana na kiwango, angalau anuwai nne za mazingira lazima zipitishwe kwa programu zilizozinduliwa:

  1. HOME - saraka ya nyumbani ya mtumiaji.
  2. LOGNAME - kuingia kwa mtumiaji.
  3. PATH ni njia ambayo unaweza kupata huduma za kawaida za mfumo.
  4. SHELL - njia ya mkalimani wa amri iliyotumiwa.

Hasa, POSIX haisemi chochote juu ya wapi maadili ya anuwai hizi yanatoka.

Muuzaji bora - Vixie cron 3.0pl1

Asili ya asili ya lahaja maarufu za cron ni Vixie cron 3.0pl1, iliyoanzishwa katika orodha ya utumaji barua pepe ya comp.sources.unix mnamo 1992. Tutazingatia sifa kuu za toleo hili kwa undani zaidi.

Vixie cron huja katika programu mbili (cron na crontab). Kama kawaida, daemon ina jukumu la kusoma na kuendesha kazi kutoka kwa jedwali la kazi la mfumo na meza za kazi za mtumiaji binafsi, na shirika la crontab linawajibika kuhariri majedwali ya watumiaji.

Jedwali la kazi na faili za usanidi

Jedwali la kazi la mtumiaji mkuu liko ndani /etc/crontab. Sintaksia ya jedwali la mfumo inalingana na sintaksia ya Vixie cron, isipokuwa safu wima ya sita ndani yake inaonyesha jina la mtumiaji ambaye kazi yake imezinduliwa kwa niaba yake:

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

Majedwali ya kazi ya mtumiaji wa kawaida yanapatikana katika /var/cron/tabs/jina la mtumiaji na hutumia sintaksia sawa. Unapoendesha matumizi ya crontab kama mtumiaji, hizi ni faili ambazo huhaririwa.

Orodha za watumiaji walio na ufikiaji wa crontab zinasimamiwa katika faili za /var/cron/ruhusu na /var/cron/kana, ambapo unahitaji tu kuingiza jina la mtumiaji kwenye mstari tofauti.

Sintaksia iliyopanuliwa

Ikilinganishwa na POSIX crontab, suluhisho la Paul Vixey lina marekebisho kadhaa muhimu kwa syntax ya jedwali la kazi la shirika.

Sintaksia mpya ya jedwali imepatikana: kwa mfano, unaweza kubainisha siku za wiki au miezi kwa jina (Jumatatu, Jumanne, na kadhalika):

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

Unaweza kutaja hatua ambayo kazi zinazinduliwa:

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

Hatua na vipindi vinaweza kuchanganywa:

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

Njia mbadala za angavu kwa sintaksia ya kawaida zinatumika (kuwasha upya, kila mwaka, kila mwaka, kila mwezi, kila wiki, kila siku, usiku wa manane, kila saa):

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

Mazingira ya utekelezaji wa kazi

Vixie cron hukuruhusu kubadilisha mazingira ya programu zinazoendesha.

Vigezo vya mazingira USER, LOGNAME na HOME hazijatolewa tu na daemon, lakini zimechukuliwa kutoka kwa faili. passwd. Tofauti ya PATH imewekwa kuwa "/usr/bin:/bin", na SHELL ya kutofautisha imewekwa kuwa "/bin/sh". Thamani za anuwai zote isipokuwa LOGNAME zinaweza kubadilishwa katika majedwali ya watumiaji.

Vigezo vingine vya mazingira (haswa SHELL na HOME) hutumiwa na cron yenyewe kuendesha kazi hiyo. Hivi ndivyo kutumia bash badala ya sh ya kawaida kuendesha kazi maalum kunaweza kuonekana kama:

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

Mwishowe, anuwai zote za mazingira zilizofafanuliwa kwenye jedwali (zinazotumiwa na cron au zinazohitajika na mchakato) zitapitishwa kwa kazi inayoendelea.

Ili kuhariri faili, crontab hutumia kihariri kilichobainishwa katika utofauti wa mazingira wa VISUAL au EDITOR. Ikiwa mazingira ambayo crontab iliendeshwa hayana vigezo hivi vilivyofafanuliwa, basi "/usr/ucb/vi" inatumika (ucb labda ni Chuo Kikuu cha California, Berkeley).

cron kwenye Debian na Ubuntu

Watengenezaji wa usambazaji wa Debian na derivative wametoa toleo lililobadilishwa sana Toleo la Vixie cron 3.0pl1. Hakuna tofauti katika syntax ya faili za jedwali; kwa watumiaji ni sawa Vixie cron. Kipengele Kipya Kubwa Zaidi: Usaidizi syslog, SELinux и PAM.

Mabadiliko yanayoonekana kidogo, lakini yanayoonekana ni pamoja na eneo la faili za usanidi na meza za kazi.

Jedwali la mtumiaji katika Debian ziko kwenye saraka ya /var/spool/cron/crontabs, jedwali la mfumo bado lipo - ndani /etc/crontab. Majedwali ya kazi mahususi ya kifurushi cha Debian yamewekwa ndani /etc/cron.d, kutoka ambapo cron daemon inazisoma kiotomatiki. Udhibiti wa ufikiaji wa mtumiaji unadhibitiwa na faili za /etc/cron.allow na /etc/cron.deny.

Kamba chaguo-msingi bado ni /bin/sh, ambayo katika Debian ni ganda dogo linaloendana na POSIX dash, ilizinduliwa bila kusoma usanidi wowote (katika hali isiyo ya mwingiliano).

Cron yenyewe katika matoleo ya hivi karibuni ya Debian imezinduliwa kupitia systemd, na usanidi wa uzinduzi unaweza kutazamwa katika /lib/systemd/system/cron.service. Hakuna kitu maalum katika usanidi wa huduma; usimamizi wowote wa hila wa kazi unaweza kufanywa kupitia anuwai za mazingira zilizotangazwa moja kwa moja kwenye crontab ya kila mtumiaji.

cronie kwenye RedHat, Fedora na CentOS

cronie - uma wa toleo la Vixie cron 4.1. Kama ilivyo kwa Debian, syntax haijabadilika, lakini msaada wa PAM na SELinux, unaofanya kazi katika nguzo, kufuatilia faili kwa kutumia inotify na huduma zingine zimeongezwa.

Usanidi wa chaguo-msingi uko katika maeneo ya kawaida: jedwali la mfumo liko /etc/crontab, vifurushi huweka meza zao ndani /etc/cron.d, meza za watumiaji huingia /var/spool/cron/crontabs.

Daemon huendesha chini ya udhibiti wa mfumo, usanidi wa huduma ni /lib/systemd/system/crond.service.

Kwenye ugawaji-kama wa Red Hat, /bin/sh hutumiwa na chaguo-msingi wakati wa kuanza, ambayo ni bash ya kawaida. Ikumbukwe kwamba wakati wa kuendesha kazi za cron kupitia /bin/sh, ganda la bash huanza katika hali ya kufuata POSIX na haisomi usanidi wowote wa ziada, unaoendesha kwa hali isiyoingiliana.

cronie katika SLES na openSUSE

Usambazaji wa Kijerumani SLES na derivative yake openSUSE hutumia cronie sawa. Daemon hapa pia imezinduliwa chini ya systemd, usanidi wa huduma iko ndani /usr/lib/systemd/system/cron.service. Usanidi: /etc/crontab, /etc/cron.d, /var/spool/cron/tabs. /bin/sh ni bash sawa inayoendesha katika hali ya kutoingiliana inayotii POSIX.

Kifaa cha Vixie cron

Wazao wa kisasa wa cron hawajabadilika sana ikilinganishwa na Vixie cron, lakini bado walipata vipengele vipya ambavyo hazihitajiki kuelewa kanuni za programu. Viendelezi vingi hivi vimeundwa vibaya na vinachanganya msimbo. Msimbo wa asili wa cron na Paul Vixey ni raha kusoma.

Kwa hiyo, niliamua kuchambua kifaa cha cron kwa kutumia mfano wa programu ya cron ya kawaida kwa matawi yote mawili ya maendeleo - Vixie cron 3.0pl1. Nitarahisisha mifano kwa kuondoa ifdefs ambazo zinatatiza usomaji na kuacha maelezo madogo.

Kazi ya pepo inaweza kugawanywa katika hatua kadhaa:

  1. Uanzishaji wa programu.
  2. Kukusanya na kusasisha orodha ya majukumu ya kufanya.
  3. Kitanzi kikuu cha cron kinachoendesha.
  4. Anza kazi.

Hebu tuwaangalie kwa utaratibu.

Uanzishaji

Inapoanzishwa, baada ya kuangalia hoja za mchakato, cron husakinisha vidhibiti vya mawimbi vya SIGCHLD na SIGHUP. Ya kwanza hufanya ingizo la logi kuhusu kukomesha mchakato wa mtoto, ya pili inafunga maelezo ya faili ya faili ya logi:

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

Daemon ya cron daima huendesha peke yake kwenye mfumo, tu kama mtumiaji mkuu na kutoka kwa saraka kuu ya cron. Simu zifuatazo huunda faili ya kufunga na PID ya mchakato wa daemon, hakikisha kuwa mtumiaji ni sahihi na ubadilishe saraka ya sasa kuwa kuu:

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

Njia chaguo-msingi imewekwa, ambayo itatumika wakati wa kuanza michakato:

setenv("PATH", _PATH_DEFPATH, 1);

Kisha mchakato ni "daemonized": huunda nakala ya mtoto ya mchakato kwa kupiga uma na kipindi kipya katika mchakato wa mtoto (kupigia simu). Mchakato wa mzazi hauhitajiki tena, na hutoka:

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

Kukomesha mchakato wa mzazi kunatoa kufuli kwenye faili ya kufuli. Kwa kuongeza, inahitajika kusasisha PID katika faili kwa mtoto. Baada ya hayo, hifadhidata ya kazi imejazwa:

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

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

Kisha cron inakwenda kwenye mzunguko mkuu wa kazi. Lakini kabla ya hapo, inafaa kuangalia upakiaji wa orodha ya kazi.

Kukusanya na kusasisha orodha ya kazi

Kitendaji cha load_database kinawajibika kupakia orodha ya kazi. Inaangalia crontab kuu ya mfumo na saraka na faili za mtumiaji. Ikiwa faili na saraka hazijabadilika, orodha ya kazi haijasomwa tena. Vinginevyo, orodha mpya ya kazi huanza kuunda.

Inapakia faili ya mfumo iliyo na faili maalum na majina ya jedwali:

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

Inapakia meza za watumiaji kwenye kitanzi:

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

Baada ya hapo hifadhidata ya zamani inabadilishwa na mpya.

Katika mifano hapo juu, simu ya kazi ya process_crontab inathibitisha kuwa mtumiaji anayelingana na jina la faili ya jedwali yupo (isipokuwa ni mtumiaji mkuu) na kisha kupiga simu load_user. Mwisho tayari husoma faili yenyewe mstari kwa mstari:

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

Hapa, ama utofauti wa mazingira umewekwa (mistari ya fomu VAR=value) kwa kutumia vitendaji vya load_env / env_set, au maelezo ya kazi yanasomwa (* * * * * /path/to/exec) kwa kutumia kazi ya load_entry.

Chombo cha kuingia ambacho load_entry inarudi ni kazi yetu, ambayo imewekwa katika orodha ya jumla ya kazi. Chaguo za kukokotoa zenyewe hubeba uchanganuzi wa kitenzi cha umbizo la wakati, lakini tunavutiwa zaidi na uundaji wa anuwai za mazingira na vigezo vya uzinduzi wa kazi:

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

Kitanzi kikuu hufanya kazi na orodha ya sasa ya kazi.

Kitanzi kikuu

Cron asili kutoka kwa Toleo la 7 Unix ilifanya kazi kwa urahisi kabisa: ilisoma tena usanidi katika kitanzi, ilizindua majukumu ya dakika ya sasa kama mtumiaji mkuu, na ikalala hadi kuanza kwa dakika inayofuata. Mbinu hii rahisi kwenye mashine za zamani ilihitaji rasilimali nyingi sana.

Toleo mbadala lilipendekezwa katika SysV, ambapo daemon ililala hadi dakika ya karibu ambayo kazi ilifafanuliwa, au kwa dakika 30. Rasilimali chache zilitumiwa kwa kusoma tena usanidi na kuangalia kazi katika hali hii, lakini kusasisha haraka orodha ya kazi ikawa ngumu.

Vixie cron alirudi kukagua orodha za kazi mara moja kwa dakika, kwa bahati nzuri hadi mwisho wa miaka ya 80 kulikuwa na rasilimali zaidi kwenye mashine za kawaida za 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;
}

Kitendaji cha cron_sleep kinahusika moja kwa moja katika kutekeleza kazi, kuita kazi_runqueue (hesabu na endesha kazi) na do_command (endesha kila kazi ya mtu binafsi). Kazi ya mwisho inafaa kuchunguzwa kwa undani zaidi.

Kuendesha kazi

Kazi ya do_command inatekelezwa kwa mtindo mzuri wa Unix, ambayo ni, hufanya uma kutekeleza kazi hiyo kwa usawa. Mchakato wa mzazi unaendelea kuzindua kazi, mchakato wa mtoto huandaa mchakato wa kazi:

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

Kuna mantiki nyingi katika child_process: inakubali pato la kawaida na mitiririko ya makosa, kisha inatuma kwa barua (ikiwa utofauti wa mazingira wa MAILTO umeainishwa kwenye jedwali la kazi), na, mwishowe, inangojea mchakato kuu wa kazi. kamili.

Mchakato wa kazi huundwa na uma mwingine:

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

Hiyo ni kimsingi yote cron ni. Niliacha maelezo ya kuvutia, kwa mfano, uhasibu kwa watumiaji wa mbali, lakini nilielezea jambo kuu.

Baada ya

Cron ni programu rahisi na muhimu ya kushangaza, iliyotengenezwa kwa mila bora za ulimwengu wa Unix. Hafanyi chochote cha ziada, lakini amekuwa akifanya kazi yake kwa njia ya ajabu kwa miongo kadhaa sasa. Kupitia msimbo wa toleo linalokuja na Ubuntu hakuchukua zaidi ya saa moja, na nilifurahiya sana! Natumai niliweza kushiriki nawe.

Sijui kuhusu wewe, lakini nina huzuni kidogo kutambua kwamba programu za kisasa, pamoja na tabia yake ya kuwa ngumu zaidi na isiyo ya kawaida, haijawa na unyenyekevu huo kwa muda mrefu.

Kuna njia nyingi za kisasa za cron: timed-timers hukuruhusu kupanga mifumo ngumu na utegemezi, fcron hukuruhusu kudhibiti utumiaji wa rasilimali kwa kazi kwa urahisi. Lakini kibinafsi, crontab rahisi zaidi ilikuwa ya kutosha kwangu kila wakati.

Kwa kifupi, penda Unix, tumia programu rahisi na usisahau kusoma mana ya jukwaa lako!

Chanzo: mapenzi.com

Kuongeza maoni