Cron i Linux: hitori, whakamahi me te taputapu

Cron i Linux: hitori, whakamahi me te taputapu

I tuhia e te matarohia ko nga haora hari e kore e matakitaki. I aua wa mohoao karekau he kaihōtaka, he Unix ranei, engari i enei ra ka tino mohio nga kaihōtaka: cron ka pupuri i te waa hei utu mo ratou.

Ko nga taputapu raina whakahau he ngoikore, he mahi hoki ki ahau. sed, awk, wc, cut and other old programmes are runs by scripts on our servers ia ra. He maha o raatau i hangaia hei mahi ma te cron, he kaiwhakarite mai i nga tau 70.

Mo te wa roa ka whakamahi ahau i te cron ki runga rawa, me te kore e uru ki nga korero, engari i tetahi ra, ka tutaki ahau i tetahi hapa i te wa e whakahaere ana ahau i tetahi tuhinga, ka whakatau ahau ki te ata tirotiro. Koinei te ahua o tenei tuhinga, i te wa e tuhi ana i mohio ahau ki te POSIX crontab, nga whiringa cron matua i roto i nga tohatoha Linux rongonui me te hanganga o etahi o ratou.

Kei te whakamahi koe i te Linux me te whakahaere i nga mahi cron? Kei te pirangi koe ki te hoahoanga tono punaha i Unix? Na kei te haere matou!

Tuhinga

Te putake o nga momo

Ko te mahi i ia wa o nga kaiwhakamahi, i nga kaupapa punaha ranei he mea tino tika i roto i nga punaha whakahaere katoa. Na reira, i mohio nga kaihaotaka ki te hiahia mo nga ratonga e taea ai e ratou te whakamahere me te mahi i nga mahi i mua noa atu.

Ko nga punaha whakahaere e rite ana ki a Unix ka hoki mai ki te Putanga 7 Unix, i whakawhanakehia i nga tau 70 o te rautau kua hipa i Bell Labs, tae atu ki a Ken Thompson rongonui. Putanga 7 Unix hoki cron, he ratonga mo te whakahaere i nga mahi superuser i nga wa katoa.

He kaupapa ngawari te cron hou, engari he maamaa ake te mahinga algorithm o te putanga taketake: kotahi te meneti ka oho te ratonga, panui tepu me nga mahi mai i te konae kotahi (/etc/lib/crontab) ka mahia mo te superuser aua mahi e tika ana kia mahia i tenei wa.

I muri mai, ko nga putanga pai ake o te ratonga ngawari me te whaihua i tukuna me nga punaha whakahaere rite Unix katoa.

Ko nga whakaahuatanga whanui mo te whakatakotoranga crontab me nga maataapono taketake o te mahi a te taputapu i whakauruhia ki roto i te paerewa matua o nga punaha whakahaere rite-Unix - POSIX - i te tau 1992, na reira ka noho te cron mai i te paerewa de facto hei paerewa de jure.

I te tau 1987, ko Paul Vixie, i te rangahau i nga kaiwhakamahi Unix mo o ratou hiahia mo te cron, i tukuna tetahi atu putanga o te daemon i whakatika etahi o nga raruraru o te cron tuku iho me te whakawhānui ake i te syntax o nga konae ripanga.

Na te tuatoru o nga putanga o Vixie cron i timata ki te whakatutuki i nga whakaritenga POSIX, hei taapiri, he raihana tuku noa te kaupapa, kaore ranei he raihana, engari mo nga hiahia i roto i te README: kaore te kaituhi e tuku taurangi, te ingoa o te kaituhi. e kore e taea te muku, ka taea anake te hoko tahi me te waehere puna. Ko enei whakaritenga ka taurite ki nga maataapono o te rorohiko kore utu e rongonui haere ana i aua tau, no reira ko etahi o nga tohatoha Linux matua i puta mai i te timatanga o nga tau 90 ka mau a Vixie cron hei punaha tuatahi, kei te whanake tonu i enei ra.

Ina koa, ka hangaia e Red Hat me SUSE tetahi marau o Vixie cron - cronie, a ka whakamahia e Debian me Ubuntu te putanga taketake o Vixie cron me te maha o nga papanga.

Kia mohio tatou ki te crontab whaipainga kaiwhakamahi e whakaahuatia ana i roto i te POSIX, muri iho ka titiro tatou ki nga toronga syntax e whakaratohia ana i Vixie cron me te whakamahi i nga rereketanga o Vixie cron i roto i nga tohatoha Linux rongonui. Ka mutu, ko te here i runga i te keke ko te tātaritanga o te taputapu cron daemon.

POSIX crontab

Mena i mahi tonu te cron taketake mo te superuser, he maha nga wa e mahi ana nga kaiwhakariterite hou ki nga mahi a nga kaiwhakamahi noa, he pai ake, he watea.

Ka tukuna nga Crons hei huinga o nga kaupapa e rua: ko te cron daemon e rere tonu ana me te taputapu crontab e waatea ana ki nga kaiwhakamahi. Ko tenei ka taea e koe te whakatika i nga ripanga mahi motuhake mo ia kaiwhakamahi i roto i te punaha, i te wa ka whakarewahia e te daemon nga mahi mai i nga ripanga kaiwhakamahi me nga punaha.

В POSIX paerewa Ko te whanonga o te daemon kaore i te whakaahuahia i tetahi huarahi, ko te kaupapa kaiwhakamahi anake ka whakamanahia crontab. Ko te noho o nga tikanga mo te whakarewa i nga mahi a nga kaiwhakamahi, ko te tikanga, he tohu, engari kaore i te whakaahuahia.

Ma te karanga i te whaipainga crontab, ka taea e koe te mahi e wha nga mea: whakatika te ripanga mahi a te kaiwhakamahi i roto i te ētita, utaina te ripanga mai i te konae, whakaatu i te ripanga mahi o naianei, ka whakawātea i te ripanga mahi. He tauira mo te mahi a te taputapu crontab:

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

Ka karangahia crontab -e ka whakamahia te ētita kua tohua ki te taurangi taiao paerewa EDITOR.

Ko nga mahi ano ka whakaahuahia i roto i te whakatakotoranga e whai ake nei:

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

Ko nga waahi tuatahi e rima o nga rekoata: meneti [1..60], haora [0..23], ra o te marama [1..31], marama [1..12], ra o te wiki [0. .6], ko 0 te Rātapu. Ko te mara whakamutunga, tuaono, he rarangi ka mahia e te kaiwhakamaori whakahau paerewa.

I roto i nga mara tuatahi e rima, ka taea te whakariterite i nga uara ka wehea e nga piko:

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

Me te tohuhono ranei:

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

Ko te urunga a te kaiwhakamahi ki te whakahōtaka mahi kei roto i te POSIX e te cron.allow me te cron.deny nga konae, e whakararangi ana i nga kaiwhakamahi e uru ana ki te crontab me nga kaiwhakamahi karekau he uru ki te hotaka. Kaore te paerewa e whakahaere i te waahi o enei konae ahakoa he aha.

E ai ki te paerewa, kia wha nga taurangi taiao me tuku ki nga kaupapa kua whakarewahia:

  1. KĀINGA - whaiaronga kāinga o te kaiwhakamahi.
  2. LOGNAME — takiuru kaiwhakamahi.
  3. Ko te PATH te huarahi ka kitea e koe nga taputapu punaha paerewa.
  4. SHELL — ara ki te kaiwhakamaori whakahau kua whakamahia.

Ko te mea nui, kaore he korero a POSIX mo te wahi i ahu mai ai nga uara mo enei taurangi.

Kaihoko pai - Vixie cron 3.0pl1

Ko te tipuna noa o nga momo cron rongonui ko Vixie cron 3.0pl1, i whakauruhia ki te rarangi mēra comp.sources.unix i te tau 1992. Ka whakaarohia e matou nga ahuatanga matua o tenei putanga i roto i nga korero taipitopito.

Ka tae mai a Vixie cron ki nga kaupapa e rua (cron me crontab). Ka rite ki o mua, ko te daemon te kawenga mo te panui me te whakahaere i nga mahi mai i te ripanga mahi punaha me nga ripanga mahi a te kaiwhakamahi takitahi, a ko te taputapu crontab te kawenga mo te whakatika i nga ripanga kaiwhakamahi.

ripanga tūmahi me ngā kōnae whirihoranga

Ko te ripanga mahi superuser kei /etc/crontab. Ko te wetereo o te ripanga punaha e rite ana ki te wetereo o Vixie cron, haunga ko te tuaono o nga pou kei roto e tohu ana i te ingoa o te kaiwhakamahi kei raro i a ia te whakarewanga o te mahi:

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

Kei roto i /var/cron/tabs/ingoawhakamahi nga ripanga mahi a te kaiwhakamahi me te whakamahi i te wetereo rite. Ina whakahaere koe i te whaipainga crontab hei kaiwhakamahi, koinei nga konae kua whakatikahia.

Ko nga rarangi o nga kaiwhakamahi e uru ana ki te crontab kei te whakahaeretia i roto i te /var/cron/allow me /var/cron/deny files, me whakauru noa koe i te ingoa kaiwhakamahi ki tetahi raina motuhake.

Wetereo roa

Ka whakatauritea ki te POSIX crontab, kei roto i te otinga a Paul Vixey he maha nga whakarereketanga tino whai hua ki te wetereo o nga ripanga mahi a te taputapu.

Kua watea mai he wetereo ripanga hou: hei tauira, ka taea e koe te tohu i nga ra o te wiki, marama ranei ma te ingoa (Mane, Tue, me etahi atu):

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

Ka taea e koe te tautuhi i te taahiraa e whakarewahia ai nga mahi:

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

Ka taea te whakakotahi i nga taahiraa me nga waahi:

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

Ka tautokohia nga momo rereke ki te wetereo o mua (whakahou, ia tau, ia tau, ia marama, ia wiki, ia ra, waenganui po, ia haora):

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

Te taiao mahi mahi

Ka taea e Vixie cron te whakarereke i te taiao o nga tono whakahaere.

Ko nga taurangi taiao USER, LOGNAME me HOME ehara i te mea homai noa e te daemon, engari he mea tango mai i te konae Tuhinga o mua. Kua tautuhia te taurangi PATH ki te "/usr/bin:/bin" ka tautuhia te taurangi SHELL ki "/ bin/sh". Ko nga uara o nga taurangi katoa engari ko LOGNAME ka taea te whakarereke i nga ripanga kaiwhakamahi.

Ko etahi taurangi taiao (te nuinga o SHELL me HOME) ka whakamahia e cron ake hei whakahaere i te mahi. Anei te ahua o te whakamahi i te bash hei utu mo te sh paerewa hei whakahaere i nga mahi ritenga:

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

Ka mutu, ko nga taurangi taiao katoa kua tautuhia ki te ripanga (whakamahia e cron, e hiahiatia ana ranei e te tukanga) ka tukuna ki te mahi whakahaere.

Hei whakatika i nga konae, ka whakamahi a crontab i te ētita kua tohua ki te taurangi taiao VISUAL, EDITOR ranei. Mena karekau enei taurangi i tautuhia e te taiao i whakahaerea ai te crontab, ka whakamahia "/usr/ucb/vi" (ko ucb pea te Whare Wananga o California, Berkeley).

cron i runga i Debian me Ubuntu

Ko nga kaihanga o Debian me nga tohatoha whakaheke kua tukuna putanga tino whakarerekētia Vixie cron putanga 3.0pl1. Karekau he rereketanga o te wetereo o nga konae ripanga; mo nga kaiwhakamahi he rite tonu te Vixie cron. Ahuahira Hou Nui: Tautoko syslog, SELinux и WFP.

He iti ake te kitea, engari ko nga huringa tino kitea ko te waahi o nga konae whirihoranga me nga ripanga mahi.

Ko nga ripanga kaiwhakamahi kei Debian kei roto i te raarangi /var/spool/cron/crontabs, kei reira tonu te ripanga punaha - kei /etc/crontab. Ka tuuhia nga ripanga mahi motuhake mo te kete Debian ki /etc/cron.d, mai i te waahi ka panui aunoatia e te cron daemon. Ko te mana uru kaiwhakamahi e whakahaeretia ana e te /etc/cron.allow me te /etc/cron.deny kōnae.

Ko te anga taunoa tonu /bin/sh, kei roto i a Debian he anga POSIX iti pīhono, i whakarewahia me te kore panui i tetahi whirihoranga (i roto i te aratau tauwhitiwhiti-kore).

Ko Cron ano i roto i nga putanga hou o Debian ka whakarewahia ma te systemd, ka taea te tiro i te whirihoranga whakarewatanga i /lib/systemd/system/cron.service. Karekau he mea motuhake i roto i te whirihoranga ratonga; ka taea te whakahaere mahi maataki ma roto i nga taurangi taiao e whakaatu tika ana i te crontab o ia kaiwhakamahi.

cronie i runga i RedHat, Fedora me CentOS

cronie - marau o Vixie cron putanga 4.1. Ka rite ki a Debian, kaore i whakarereketia te syntax, engari ko te tautoko mo te PAM me te SELinux, e mahi ana i roto i te roopu, te aroturuki i nga konae ma te whakamahi i te inotify me etahi atu waahanga kua taapirihia.

Ko te whirihoranga taunoa kei roto i nga waahi o mua: ko te ripanga punaha kei roto i /etc/crontab, ka makahia e nga kete nga ripanga ki /etc/cron.d, ka uru nga ripanga kaiwhakamahi ki roto /var/spool/cron/crontabs.

Ka rere te daemon i raro i te mana systemd, ko te whirihoranga ratonga ko /lib/systemd/system/crond.service.

I runga i nga tohatoha penei i te Hat Whero, ka whakamahia te /bin/sh ma te taunoa i te tiimatanga, koinei te bash paerewa. Me tohu ko te wa e whakahaere ana i nga mahi cron ma te / bin / sh, ka tiimata te anga bash i roto i te aratau POSIX me te kore e panui i etahi atu whirihoranga, e rere ana i roto i te aratau kore-whakawhitiwhiti.

cronie i SLES me openSUSE

Ko te tohatoha Tiamana SLES me ona huanga openSUSE e whakamahi ana i te cronie kotahi. Ko te daemon i konei ka whakarewahia ano i raro i te systemd, ko te whirihoranga ratonga kei roto /usr/lib/systemd/system/cron.service. Whirihoranga: /etc/crontab, /etc/cron.d, /var/spool/cron/tabs. /bin/sh he rite tonu te bash e rere ana i roto i te aratau tauwhitiwhiti-kore-a-POSIX.

He taputapu Vixie cron

Ko nga uri hou o cron kaore i tino rerekee ki te whakataurite ki a Vixie cron, engari i whiwhi tonu i nga ahuatanga hou kaore e hiahiatia kia mohio ki nga kaupapa o te kaupapa. Ko te nuinga o enei toronga he kino te hoahoa me te whakapoauau i te waehere. Ko te waehere puna cron taketake na Paul Vixey he pai ki te panui.

Na reira, i whakatau ahau ki te tātari i te taputapu cron ma te whakamahi i te tauira o te kaupapa cron noa ki nga peka whanaketanga e rua - Vixie cron 3.0pl1. Ka whakangawarihia e au nga tauira ma te tango i nga ifdefs e whakararu ana i te panui me te whakakore i nga korero iti.

Ko te mahi a te rewera ka taea te wehewehe ki etahi waahanga:

  1. Te arawhiti i te kaupapa.
  2. Te kohikohi me te whakahou i te rarangi o nga mahi hei whakahaere.
  3. E rere ana te kopae cron matua.
  4. Tīmatahia he mahi.

Kia titiro tatou ki a raatau.

Whakauru

I te wa i timata ai, i muri i te tirotiro i nga tohenga tukanga, ka whakauruhia e cron nga kaikawe tohu SIGCHLD me SIGHUP. Ko te tuatahi ka hanga he urunga rangitaki mo te whakamutua o te mahi a te tamaiti, ko te tuarua ka kati i te whakamaarama konae o te konae rangitaki:

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

Ko te cron daemon ka rere ko ia anake i runga i te punaha, he tino kaiwhakamahi noa mai i te raarangi cron matua. Ko nga waea e whai ake nei ka hanga he konae raka me te PID o te tukanga daemon, kia mohio kei te tika te kaiwhakamahi ka huri i te raarangi o naianei ki te mea matua:

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

Kua tautuhia te ara taunoa, ka whakamahia ina timata nga tukanga:

setenv("PATH", _PATH_DEFPATH, 1);

Na ka "daemonized" te tukanga: ka hangaia he kape tamaiti o te tukanga ma te karanga marau me te waahi hou i roto i te tukanga tamaiti (karanga setsid). Ko te tukanga matua kua kore e hiahiatia, ka puta:

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

Ka mutu te tukanga matua ka tukuna te raka ki te konae maukati. I tua atu, me whakahou i te PID i roto i te konae ki te tamaiti. Whai muri i tenei, ka whakakiia te paataka mahi:

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

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

Katahi ka neke atu a cron ki te huringa mahi matua. Engari i mua i tera, he pai ki te titiro ki te uta i te rarangi mahi.

Te kohikohi me te whakahou i te rarangi mahi

Ko te mahi load_database te kawenga mo te uta i te rarangi o nga mahi. Ka tirohia te crontab punaha matua me te raarangi me nga konae kaiwhakamahi. Mena karekau nga konae me te whaiaronga i huri, karekau te rarangi mahi e panuitia ano. Ki te kore, ka timata he rarangi mahi hou.

Kei te uta i tetahi konae punaha me nga ingoa motuhake me nga ingoa ripanga:

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

Uta ana i nga ripanga kaiwhakamahi ki te kopikopiko:

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

Whai muri ka whakakapihia te papaaarangi tawhito ki tetahi mea hou.

I roto i nga tauira i runga ake nei, ko te waea mahi process_crontab e manatoko ana kei te noho he kaiwhakamahi e taurite ana ki te ingoa konae ripanga (mehemea he superuser) ka waea atu ki a load_user. Kua panuihia e te hunga whakamutunga te konae ake rarangi ma ia rarangi:

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

I konei, ka tautuhia te taurangi taiao (nga rarangi o te ahua VAR=uara) ma te whakamahi i nga mahi load_env / env_set, ka panuihia ranei te whakaahuatanga mahi (* * * * * /path/to/exec) ma te whakamahi i te mahi uta_entry.

Ko te hinonga urunga ka whakahokia mai e te load_entry ko ta maatau mahi, ka tuu ki te rarangi whanui o nga mahi. Ko te mahi tonu e kawe ana i te whakamaarama kupu o te whakatakotoranga wa, engari he pai ake taatau ki te hanga i nga taurangi taiao me nga tawhā whakarewatanga mahi:

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

Ka mahi te kopae matua ki te rarangi mahi o naianei.

Koropiko Matua

Ko te cron taketake mai i te Putanga 7 Unix i mahi tino ngawari: ka panui ano i te whirihoranga i roto i te kohanga, ka whakarewahia nga mahi o te meneti o naianei hei superuser, ka moe tae noa ki te timatanga o te meneti e whai ake nei. Ko tenei huarahi ngawari ki nga miihini tawhito me nui rawa nga rauemi.

I whakatakotohia he putanga rereke i SysV, i moe ai te daemon tae noa ki te meneti tata i tautuhia ai te mahi, mo te 30 meneti ranei. He iti ake nga rauemi i pau mo te panui ano i te whirihoranga me te tirotiro i nga mahi i tenei aratau, engari ka tere te whakahōu i te rarangi o nga mahi ka raru.

I hoki mai a Vixie cron ki te tirotiro i nga rarangi mahi kotahi i te meneti, ina koa i te mutunga o nga tau 80 kua nui ake nga rauemi mo nga miihini Unix paerewa:

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

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

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

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

Ko te mahi cron_sleep e whai waahi tika ana ki te whakahaere i nga mahi, me te karanga i te job_runqueue (whakatau me te whakahaere i nga mahi) me te do_command (whakahaere i ia mahi takitahi). Ko te mahi whakamutunga he pai ki te tirotiro i nga taipitopito.

Te whakahaere mahi

Ko te mahi do_command ka mahia i roto i te ahua Unix pai, ara, he marau hei mahi i te mahi i te wa kotahi. Ko te tukanga matua kei te haere tonu ki te whakarewa i nga mahi, ko te tukanga o te tamaiti te whakarite i te tukanga mahi:

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

He nui te arorau i roto i te child_process: ka mau te putanga paerewa me nga rerenga hapa ki runga i a ia ano, kia tukuna ai ki te mēra (mehemea ka tohua te taurangi taiao MAILTO ki te ripanga mahi), ka mutu, ka tatari mo te matua te tukanga o te mahi hei whakaoti.

Ko te tukanga mahi he mea hanga e tetahi atu marau:

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

Ko te tikanga cron katoa. I whakarerea e ahau etahi korero whakamere, hei tauira, te kaute mo nga kaiwhakamahi mamao, engari i whakaatu ahau i te mea nui.

Afterword

Ko te Cron he kaupapa tino maamaa me te whai hua, i hangaia i roto i nga tikanga pai o te ao Unix. Kaore ia e mahi i etahi atu mea, engari he mea whakamiharo tana mahi mo nga tau tekau inaianei. Ko te tango i te waehere mo te putanga ka tae mai me Ubuntu kaore i neke atu i te haora, a he tino ngahau ahau! Te ti'aturi nei au i taea e au te whakapuaki ki a koe.

Kaore au i te mohio ki a koe, engari he ahua pouri ahau ki te mohio ko nga kaupapa hou, me te kaha ki te whakaraerae me te whakaraerae, kaore i pai ki te ngawari mo te wa roa.

He maha nga momo rereke hou ki te cron: ka taea e te systemd-timers te whakarite i nga punaha uaua me nga whakawhirinakitanga, ka taea e te fcron te whakahaere ngawari ake i te kohi rawa ma nga mahi. Engari mo au ake, ko te crontab ngawari i nga wa katoa ka nui ki ahau.

Hei poto, aroha ki a Unix, whakamahia nga kaupapa ngawari, kaua hoki e wareware ki te panui i te mana mo to papaahi!

Source: will.com

Tāpiri i te kōrero