Cron muLinux: nhoroondo, kushandiswa uye mudziyo

Cron muLinux: nhoroondo, kushandiswa uye mudziyo

The classic akanyora kuti maawa anofadza haaoni. Munguva idzodzo dzemusango pakanga pasina vanogadzira kana Unix, asi nhasi vagadziri vanonyatsoziva: cron inochengeta nguva pane ivo.

Command line utilities zvese kushaya simba uye ibasa kwandiri. sed, awk, wc, cheka uye zvimwe zvirongwa zvekare zvinofambiswa nemagwaro pamaseva edu mazuva ese. Mazhinji acho akagadzirwa semabasa ecron, anoronga kubva kuma70s.

Kwenguva yakareba ndaishandisa cron zvepamusoro, pasina kupinda mune zvakadzama, asi rimwe zuva, pandakasangana nechikanganiso pandaimhanya script, ndakafunga kunyatsotarisa mairi. Aya ndiwo mabudiro akaita chinyorwa ichi, ndichiri kunyora ndakaziva POSIX crontab, iyo huru cron sarudzo mune yakakurumbira Linux kugovera uye chimiro chevamwe vacho.

Uri kushandisa Linux uye uchimhanyisa cron mabasa? Iwe unofarira here system application yekuvaka muUnix? Ipapo tave munzira!

Zviri mukati

Kwakatangira mhando

Periodic execution yemushandisi kana system zvirongwa chinhu chiri pachena chinodiwa mune ese anoshanda masisitimu. Naizvozvo, vanogadzira mapurogiramu vakaona kudiwa kwemasevhisi anovabvumira kuronga nekuita mabasa kare kare.

Unix-senge masisitimu ekushandisa anoteedzera kwaakabva kuVersion 7 Unix, yakagadzirwa mu70s yezana ramakore rapfuura kuBell Labs, kusanganisira naKen Thompson ane mukurumbira. Shanduro 7 Unix yaisanganisirawo cron, sevhisi yekugara ichimhanyisa superuser mabasa.

Iyo yakajairika yemazuva ano cron chirongwa chakareruka, asi inoshanda algorithm yeshanduro yekutanga yaive yakapusa: sevhisi yaimuka kamwe paminiti, verenga tafura ine mabasa kubva kune imwechete faira (/etc/lib/crontab) uye yakaitirwa iyo superuser mabasa iwayo aifanira kunge akaitwa panguva ino.

Zvadaro, shanduro dzakavandudzwa dzebasa rakapfava uye rinobatsira dzakapihwa neese Unix-senge masisitimu anoshanda.

Tsanangudzo dzakajairwa dzeiyo crontab fomati uye nheyo dzekutanga dzekushanda kweiyo utility dzakaverengerwa muyero huru yeUnix-senge masisitimu anoshanda - POSIX - muna 1992, uye nekudaro cron kubva kune de facto standard yakava de jure standard.

Muna 1987, Paul Vixie, aongorora vashandisi veUnix nezvezvido zvavo zvecron, akaburitsa imwe vhezheni yedaemon yakagadzirisa mamwe matambudziko echinyakare cron uye akawedzera syntax yemafaira etafura.

Neyechitatu vhezheni yeVixie cron yakatanga kusangana nePOSIX zvinodiwa, mukuwedzera, chirongwa chacho chaive nerezinesi rakasununguka, kana kuti pakanga pasina rezinesi zvachose, kunze kwezvido mu README: munyori haapi vimbiso, zita remunyori. haigone kudzimwa, uye chirongwa chinogona kutengeswa chete pamwe chete nekodhi kodhi. Izvi zvinodikanwa zvakazove zvinofambirana nemisimboti yemahara software yaive ichizivikanwa mumakore iwayo, saka mamwe akakosha eLinux kugovera akaonekwa mukutanga 90s akatora Vixie cron sehurongwa hwavo hwekutanga uye vachiri kusimudzira nanhasi.

Kunyanya, Red Hat uye SUSE inogadzira forogo yeVixie cron - cronie, uye Debian uye Ubuntu vanoshandisa iyo yekutanga edition yeVixie cron ine akawanda mapechi.

Ngatitangei kujairana nemushandisi utility crontab inotsanangurwa muPOSIX, mushure mezvo isu tichatarisa iyo syntax yekuwedzera yakapihwa muVixie cron uye kushandiswa kwekusiyana kweVixie cron mune yakakurumbira Linux kugoverwa. Uye pakupedzisira, cherry pakiki ndiyo kuongororwa kwecron daemon device.

POSIX crontab

Kana iyo yepakutanga cron yaigara ichishandira iyo superuser, vagadziri vemazuva ano vanowanzobata nemabasa evashandisiwo zvavo, izvo zvakachengeteka uye zviri nyore.

Crons inopihwa seti yezvirongwa zviviri: iyo inogara ichimhanya cron daemon uye iyo crontab yekushandisa inowanikwa kune vashandisi. Iyo yekupedzisira inobvumidza iwe kugadzirisa matafura ebasa akananga kune wega mushandisi muhurongwa, nepo daemon ichitanga mabasa kubva kune mushandisi uye system matafura.

В POSIX chiyero maitiro e daemon haatsanangurwe neimwe nzira uye chirongwa chemushandisi chete chinogadzirwa crontab. Kuvepo kwemaitiro ekutangisa mabasa evashandisi, hongu, zvinorehwa, asi hazvina kutsanangurwa zvakadzama.

Nekudaidza iyo crontab utility, unogona kuita zvinhu zvina: gadzirisa tafura yebasa remushandisi mupepeti, kurodha tafura kubva mufaira, ratidza tafura yebasa iripo, uye bvisa tafura yebasa. Mienzaniso yemashandiro anoita crontab utility:

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

Pakufona crontab -e mupepeti anotsanangurwa mune yakajairwa nharaunda shanduko ichashandiswa EDITOR.

Iwo mabasa pachawo anotsanangurwa nenzira inotevera:

# строки-комментарии игнорируются
#
# задача, выполняемая ежеминутно
* * * * * /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 mishanu yekutanga yezvinyorwa: maminitsi [1..60], maawa [0..23], mazuva emwedzi [1..31], mwedzi [1..12], mazuva evhiki [0. .6], apo 0 ari Svondo. Yekupedzisira, yechitanhatu, munda mutsara uchaitwa neyakajairwa muturikiri wekuraira.

Munzvimbo shanu dzekutanga, kukosha kunogona kunyorwa kupatsanurwa nemakoma:

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

Kana ne hyphen:

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

Kuwanikwa kwemushandisi kurongwa hwebasa kunodzorwa muPOSIX ne cron.allow uye cron.deny mafaera, ayo anonyora vashandisi vane mukana kune crontab uye vashandisi vasina kuwana chirongwa, zvichiteerana. Iyo chiyero haidzore nzvimbo yemafaira aya chero nzira.

Zvinoenderana nechiyero, anokwana mana akasiyana nharaunda anofanirwa kupfuudzwa kune zvakatangwa zvirongwa:

  1. HOME - dhairekitori remusha remushandisi.
  2. LOGNAME - mushandisi kupinda.
  3. PATH ndiyo nzira yaunogona kuwana yakajairwa sisitimu zvishandiso.
  4. SHELL - nzira kune yakashandiswa muturikiri wemirairo.

Zvikuru, POSIX hapana chaanotaura nezvekuti ukoshi hweizvi zvinosiyana zvinobva kupi.

Mutengesi akanyanya - Vixie cron 3.0pl1

Madzitateguru anozivikanwa emhando dzakasiyana dzecron ndiVixie cron 3.0pl1, yakaunzwa mune comp.sources.unix mailing list muna 1992. Tichatarisa zvinhu zvikuru zveshanduro iyi zvakadzama.

Vixie cron inouya muzvirongwa zviviri (cron uye crontab). Semazuva ese, iyo daemon ine basa rekuverenga uye kuita mabasa kubva kune system basa tafura uye ega mushandisi basa matafura, uye iyo crontab utility ine basa rekugadzirisa matafura evashandisi.

Task table uye mafaira ekugadzirisa

Iyo superuser yebasa tafura iri mukati /etc/crontab. Iyo syntax yetafura yehurongwa inoenderana neiyo syntax yeVixie cron, kunze kwekunge iyo koramu yechitanhatu mairi inoratidza zita remushandisi uyo anotangwa basa racho:

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

Yenguva dzose mushandisi basa matafura ari mukati /var/cron/tabs/username uye shandisa iyo yakafanana syntax. Paunomhanyisa crontab utility semushandisi, aya ndiwo mafaera anogadziriswa.

Rondedzero yevashandisi vane mukana wecrontab inotungamirwa mu / var/cron/bvumira uye / var/cron/ramba mafaera, kwaunongoda kuisa zita remushandisi mumutsara wakasiyana.

Yakawedzerwa syntax

Kuenzaniswa nePOSIX crontab, mhinduro yaPaul Vixey ine akati wandei anobatsira magadzirirwo kune syntax yematafura ebasa rekushandisa.

Nyowani tafura syntax yave kuwanikwa: semuenzaniso, unogona kutsanangura mazuva evhiki kana mwedzi nemazita (Mon, Tue, zvichingodaro):

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

Iwe unogona kutsanangura nhanho kuburikidza iyo mabasa anotangwa:

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

Matanho uye nguva zvinogona kusanganiswa:

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

Intuitive dzimwe nzira kune yakajairika syntax inotsigirwa (reboot, gore negore, gore negore, pamwedzi, vhiki nevhiki, zuva nezuva, pakati peusiku, awa):

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

Task execution environment

Vixie cron inobvumidza iwe kuti uchinje nharaunda yekumhanya maapplication.

Mamiriro ezvinhu akasiyana USER, LOGNAME ne HOME haana kungopihwa nedaemon, asi anotorwa kubva mufaira. passwd. Musiyano wePATH wakaiswa ku "/usr/bin:/bin" uye SHELL musiyano wakaiswa ku "/bin/sh". Hukoshi hwese akasiyana kunze kweLOGNAME hunogona kuchinjwa mumatafura evashandisi.

Mamwe machinjiro enzvimbo (kunyanya SHELL uye HOME) anoshandiswa necron pachayo kuita basa racho. Hezvino izvo kushandisa bash pachinzvimbo cheyakajairwa sh kumhanya etsika mabasa angaite senge:

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

Pakupedzisira, ese machinjiro ezvakatipoteredza anotsanangurwa mutafura (anoshandiswa necron kana anodiwa nemaitiro) achapfuudzwa kubasa rekumhanya.

Kugadzirisa mafaera, crontab inoshandisa mupepeti anotsanangurwa muVISUAL kana EDITOR nharaunda inosiyana. Kana iyo nharaunda iyo crontab yaiitwa isina aya akasiyana anotsanangurwa, ipapo "/usr/ucb/vi" inoshandiswa (ucb ingangove iyo University yeCalifornia, Berkeley).

cron paDebian uye Ubuntu

Vagadziri veDebian uye derivative distributions vaburitswa yakagadziridzwa zvakanyanya shanduro Vixie cron shanduro 3.0pl1. Iko hakuna misiyano mune syntax yemafaira etafura; kune vashandisi ndiyo yakafanana Vixie cron. Chikuru Chitsva Chitsva: Tsigiro syslog, SELinux и PAM.

Zvishoma zvinoonekwa, asi shanduko dzinobatika dzinosanganisira nzvimbo yemafaira ekugadzirisa uye matafura ebasa.

Matafura emushandisi muDebian ari mu /var/spool/cron/crontabs dhairekitori, iyo system tafura ichiripo - mu /etc/crontab. Debian package-chaiwo matafura ebasa anoiswa mukati /etc/cron.d, kubva painoverenga cron daemon otomatiki. Mushandisi wekuwana kutonga kunodzorwa ne /etc/cron.allow uye /etc/cron.deny mafaera.

Iyo yakasarudzika shell ichiri /bin/sh, iyo muDebian idiki POSIX-inoenderana shell dash, yakatangwa pasina kuverenga chero gadziriro (mune isiri-interactive mode).

Cron pachayo mumavhezheni achangoburwa eDebian inotangwa kuburikidza nesystemd, uye iyo yekutanga gadziriso inogona kutariswa mukati /lib/systemd/system/cron.service. Iko hakuna chinhu chakakosha mukumisikidzwa kwesevhisi; chero manejimendi ebasa akajeka anogona kuitwa kuburikidza nemamiriro ekunze akasiyana akaziviswa zvakananga mucrontab yemushandisi wega wega.

cronie paRedHat, Fedora uye CentOS

crony - forogo yeVixie cron vhezheni 4.1. Sezviri muDebian, iyo syntax haina kuchinja, asi tsigiro yePAM neSELinux, ichishanda muboka, kuronda mafaera uchishandisa inotify uye zvimwe zvinhu zvakawedzerwa.

Iyo yekusagadzika gadziriso iri munzvimbo dzakajairwa: iyo system tafura iri mu /etc/crontab, mapakeji anoisa matafura avo mukati /etc/cron.d, matafura evashandisi anopinda /var/spool/cron/crontabs.

Iyo daemon inomhanya pasi pe systemd control, iyo sevhisi yekumisikidza iri /lib/systemd/system/crond.service.

PaRed Hat-sekugovera, /bin/sh inoshandiswa nekukasira pakutanga, inova ndiyo yakajairwa bash. Izvo zvinofanirwa kucherechedzwa kuti kana uchimhanyisa cron mabasa kuburikidza / bin/sh, iyo bash shell inotanga muPOSIX-inopindirana modhi uye haiverenge chero yakawedzera gadziriso, inoshanda mune isiri-interactive mode.

cronie muSLES uye vhuraSUSE

Iyo yekuGerman yekugovera SLES uye yakabva kuvhuraSUSE shandisa imwecheteyo cronie. Iyo daemon pano inotangwa zvakare pasi pe systemd, iyo sevhisi yekumisikidza iri mukati /usr/lib/systemd/system/cron.service. Kugadzirisa: /etc/crontab, /etc/cron.d, /var/spool/cron/tabs. /bin/sh ndiyo imwechete bash inomhanya muPOSIX-inoenderana isina-inopindirana modhi.

Vixie cron mudziyo

Zvizvarwa zvemazuva ano zvecron hazvina kushanduka zvakanyanya kana zvichienzaniswa naVixie cron, asi vachiri kuwana zvinhu zvitsva zvisingadiwi kunzwisisa misimboti yechirongwa. Mazhinji eaya ekuwedzera haana kugadzirwa zvakanaka uye anovhiringa kodhi. Iyo yekutanga cron source code naPaul Vixey inonakidza kuverenga.

Naizvozvo, ndakafunga kuongorora iyo cron mudziyo ndichishandisa muenzaniso wechirongwa checron chakajairika kune ese matavi ebudiriro - Vixie cron 3.0pl1. Ini ndicharerutsa mienzaniso nekubvisa ifdefs inonetsa kuverenga nekusiya zvidiki zvidiki.

Basa redhimoni rinogona kukamurwa kuita matanho akati wandei:

  1. Chirongwa chekutanga.
  2. Kuunganidza nekugadzirisa rondedzero yemabasa ekuita.
  3. Main cron loop ichimhanya.
  4. Tanga basa.

Ngativatarisei muhurongwa.

Kutanga

Kana yatanga, mushure mekutarisa maitiro enharo, cron inoisa iyo SIGCHLD uye SIGHUP masaini mabati. Yekutanga inoita regi yekupinda nezve kupera kwemaitiro emwana, yechipiri inovhara iyo faira tsananguro yefaira regi:

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

Iyo cron daemon inogara ichimhanya yega pane system, chete seye superuser uye kubva kune main cron dhairekitori. Mafoni anotevera anogadzira faira rekukiya nePID yedaemon process, ita shuwa kuti mushandisi akarurama uye shandura dhairekitori razvino kuita iro guru:

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

Iyo yakasarudzika nzira yakasetwa, iyo ichashandiswa kana uchitanga maitiro:

setenv("PATH", _PATH_DEFPATH, 1);

Zvadaro maitiro acho "daemonized": inogadzira kopi yemwana yemaitiro nekudaidza forogo uye chikamu chitsva mukuita kwemwana (kudaidza setsid). Maitiro emubereki haachadiwi, uye anobuda:

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

Kugumiswa kwemaitiro evabereki kunoburitsa kiyi pafaira rekukiya. Mukuwedzera, zvinodikanwa kugadzirisa PID mufaira kumwana. Mushure meizvi, iyo dhatabhesi yebasa inozadzwa mu:

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

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

Ipapo cron inoenda kune iyo huru yebasa kutenderera. Asi zvisati zvaitika, zvakakosha kuti titarise kurodha rondedzero yebasa.

Kuunganidza nekugadzirisa rondedzero yebasa

Iyo load_database basa ine basa rekurodha rondedzero yemabasa. Inotarisa iyo huru system crontab uye dhairekitori ine mafaera emushandisi. Kana mafaera uye dhairekitori zvisina kuchinja, rondedzero yebasa haina kuverengwa zvakare. Zvikasadaro, runyoro rutsva rwemabasa runotanga kuumba.

Kurodha system faira ine yakakosha faira nemazita etafura:

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

Kurodha matafura evashandisi mune loop:

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

Mushure meiyo dhatabhesi yekare inotsiviwa neimwe nyowani.

Mumienzaniso iri pamusoro, iyo process_crontab basa rekufona rinoratidza kuti mushandisi anofananidzira zita refaira retafura aripo (kunze kwekunge iri superuser) obva adaidza load_user. Iyo yekupedzisira inotoverenga iyo faira pachayo mutsara nemutsara:

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

Pano, ingave shanduko yemamiriro ekunze yakaiswa (mitsetse yefomu VAR = kukosha) uchishandisa iyo load_env / env_set mabasa, kana tsananguro yebasa inoverengwa (* * * * * /path/to/exec) uchishandisa iyo load_entry function.

Iyo yekupinda iyo iyo load_entry inodzoka ibasa redu, iro rinoiswa mune yakajairika runyorwa rwemabasa. Iro basa pacharo rinoita verbose parsing yenguva fomati, asi isu tinonyanya kufarira kuumbwa kwezvakasiyana siyana uye basa rekutanga paramita:

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

Iyo huru loop inoshanda neyazvino rondedzero yemabasa.

Main Loop

Iyo yepakutanga cron kubva Version 7 Unix yakashanda zvakapusa: iyo yakaverenga zvakare gadziriso muchiuno, yakatanga mabasa eminiti iripo semushandisi mukuru, uye yakarara kusvika kutanga kweminiti inotevera. Iyi nzira iri nyore pamichina yekare yaida zviwanikwa zvakawandisa.

Imwe vhezheni yakatsanangurwa muSysV, umo daemon yakaenda kunorara kusvika paminiti yepedyo iyo basa rakatsanangurwa, kana kwemaminitsi makumi matatu. Zvishoma zviwanikwa zvakapedzwa pakuverenga zvakare kugadziridzwa uye kutarisa mabasa mune iyi modhi, asi nekukurumidza kugadzirisa rondedzero yemabasa kwakava kusagadzikana.

Vixie cron akadzokera kunotarisa rondedzero yebasa kamwe chete paminiti, nerombo rakanaka pakupera kwema80s pakanga paine zvakanyanya zviwanikwa pamichina yeUnix yakajairwa:

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

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

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

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

Iyo cron_sleep basa inobatanidzwa zvakananga mukuita mabasa, ichidaidza iyo job_runqueue (verenga uye mhanyisa mabasa) uye do_command (mhanya yega yega basa) mabasa. Basa rekupedzisira rakakodzera kuongororwa zvakadzama.

Kumhanyisa basa

Iyo do_command basa rinoitwa mune yakanaka Unix maitiro, ndiko kuti, inoita forogo kuita basa racho asynchronously. Maitiro emubereki anoenderera mberi nekutanga mabasa, maitiro emwana anogadzirira basa rekuita:

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

Pane zvakawanda zvine musoro mumwana_process: zvinotora zvakajairwa kubuda uye kukanganisa hova pairi, kuitira kuti wozoitumira kune tsamba (kana iyo MAILTO nharaunda shanduko yakatsanangurwa mutafura yebasa), uye, pakupedzisira, inomirira iyo huru. nzira yebasa rekupedzisa.

Basa rekuita rinoumbwa neimwe forogo:

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

Ndizvo chaizvo zvese cron iri. Ndakasiya zvimwe zvinonakidza zvinhu, semuenzaniso, accounting yevashandisi vari kure, asi ini ndakatsanangura chinhu chikuru.

Afterword

Cron chirongwa chinokatyamadza uye chinobatsira, chakagadzirwa mutsika dzakanakisa dzepasirese Unix. Haana chaanoita chekuwedzera, asi ave achiita basa rake zvinoshamisa kwemakumi emakore akati wandei. Kupfuura nekodhi yevhezheni inouya neUbuntu haina kutora nguva inopfuura awa, uye ndakava nekunakidzwa kwakawanda! Ndinovimba ndakwanisa kukugoverai.

Ini handizive nezvako, asi ndinosuwa zvishoma kuona kuti hurongwa hwemazuva ano, nehunhu hwayo hwekunyanya kuomesera uye kupfupikisa, hauna kuita kuti kuve nyore kudaro kwenguva yakareba.

Kune dzakawanda dzemazuva ano dzimwe nzira dze cron: systemd-timers inobvumidza iwe kuronga akaomarara masisitimu ane zvinotsamira, fcron inokutendera iwe kuti uwedzere kuchinjika kudzora kushandiswa kwezviwanikwa nemabasa. Asi pachangu, iyo yakapfava crontab yaigara yakandikwanira.

Muchidimbu, kuda Unix, shandisa zvirongwa zviri nyore uye usakanganwa kuverenga mana yepuratifomu yako!

Source: www.habr.com

Voeg