Cron i Linux: talafaasolopito, faʻaoga ma masini

Cron i Linux: talafaasolopito, faʻaoga ma masini

Na tusia e le tala masani e le matamata itula fiafia. I na taimi leaga sa leai ni tagata fai polokalame po o Unix, ae o aso nei ua iloa mautinoa e le au fai polokalame: o le a siaki e cron le taimi nai lo latou.

O fa'aoga laina fa'atonu o se vaivaiga ma se galuega mo a'u. sed, awk, wc, cut ma isi polokalame tuai o loʻo faʻatautaia e faʻamaumauga i luga o la matou 'auʻaunaga i aso uma. O le tele oi latou ua mamanuina e fai ma galuega mo le cron, o se faʻatulagaga na amata mai i le 70s.

Mo se taimi umi na ou faʻaogaina ai le cron i luga ole laiga, e aunoa ma le alu i faʻamatalaga, ae i se tasi aso, ina ua ou feagai ma se mea sese pe a faʻatautaia se tusitusiga, na ou filifili e suʻesuʻe maeʻaeʻa. O le auala lea na faʻaalia ai lenei tusiga, aʻo ou tusiaina na ou masani i le POSIX crontab, o filifiliga autu cron i faʻasalalauga lauiloa Linux ma le fausaga o nisi o latou.

O e fa'aogaina Linux ma fa'atino galuega cron? E te fiafia i le faʻatulagaina o polokalama faʻaoga i Unix? Ona tatou o ai lea!

Mataupu

Amataga o ituaiga

O le fa'atinoina fa'avaitaimi o polokalame fa'aoga po'o polokalame fa'aletino ose mea e mana'omia i totonu o faiga fa'aoga uma. O le mea lea, na iloa ai e le au fai polokalame le manaʻomia o auaunaga e mafai ai ona latou fuafuaina faʻapitoa ma faʻatino galuega i se taimi ua leva.

Unix-pei o faiga faʻaogaina e suʻe lo latou tupuaga i tua i le Version 7 Unix, na atiaʻe i le 70s o le seneturi talu ai i Bell Labs, e aofia ai ma le lauiloa Ken Thompson. Fa'aliliuga 7 Unix na aofia ai fo'i le cron, o se 'au'aunaga mo le fa'atinoina masani o galuega fa'apitoa.

O se cron masani faʻaonaponei o se polokalama faigofie, ae o le faʻaogaina o le algorithm o le uluai kopi na sili atu ona faigofie: o le auaunaga na ala i luga i le minute, faitau se laulau ma galuega mai se faila e tasi (/etc/lib/crontab) ma faia mo le superuser na galuega sa tatau ona faia i le taimi nei.

Mulimuli ane, faʻaleleia faʻamatalaga o le auaunaga faigofie ma aoga na tuʻuina atu i faiga faʻaogaina uma e pei o Unix.

O faʻamatalaga lautele o le crontab format ma faʻavae autu o le faʻaogaina o le aoga na aofia ai i le tulaga autu o faiga faʻaogaina e pei o Unix - POSIX - i le 1992, ma o lea na avea ai le cron mai se tulaga faʻamaonia ma tulaga faʻapitoa.

I le 1987, Paul Vixie, ina ua uma ona suʻesuʻeina tagata Unix e uiga i o latou manaʻoga mo le cron, na tuʻuina atu ai se isi faʻataʻitaʻiga o le daemon na faʻasaʻo ai nisi o faʻafitauli o le cron masani ma faʻalauteleina le syntax o faila laulau.

I le lona tolu o lomiga o Vixie cron na amata ona ausia manaʻoga POSIX, e le gata i lea, o le polokalame sa i ai se laisene saoloto, pe sili atu foi e leai se laisene, sei vagana ai manaoga i le README: e le tuʻuina atu e le tusitala faʻamaoniga, le igoa o le tusitala. e le mafai ona tapeina, ma e na'o le polokalame e mafai ona fa'atau fa'atasi ma fa'ailoga puna. O nei manaʻoga na foliga mai e fetaui ma mataupu faavae o polokalama faakomepiuta na maua le lauiloa i na tausaga, o lea o nisi o faʻasalalauga Linux autu na faʻaalia i le amataga o le 90s na avea Vixie cron e avea ma a latou polokalama muamua ma o loʻo atinaʻe pea i aso nei.

Aemaise lava, Red Hat ma SUSE atiaʻe se tui o Vixie cron - cronie, ma Debian ma Ubuntu faʻaaoga le uluai lomiga o Vixie cron ma le tele o patches.

Seʻi o tatou masani muamua i le crontab faʻaoga faʻaoga o loʻo faʻamatalaina i le POSIX, a maeʻa ona tatou vaʻavaʻai i faʻaopoopoga o le syntax o loʻo tuʻuina atu i Vixie cron ma le faʻaogaina o fesuiaiga o Vixie cron i tufatufa lauiloa Linux. Ma le mea mulimuli, o le cherry i luga o le keke o le auiliiliga lea o le masini cron daemon.

POSIX crontab

Afai o le uluai cron e galue i taimi uma mo le superuser, o tagata faʻatulagaina faʻaonaponei e masani ona feagai ma galuega a tagata masani, lea e sili atu ona malupuipuia ma faigofie.

O Crons o lo'o tu'uina atu o se seti o polokalame e lua: o le cron daemon o lo'o fa'aauau pea ma le crontab fa'aoga avanoa mo tagata fa'aoga. O le mea mulimuli e mafai ai e oe ona faʻasaʻo laulau o galuega faʻapitoa mo tagata taʻitoʻatasi i totonu o le polokalama, aʻo faʻalauiloa e le daemon galuega mai laulau faʻaoga ma laulau.

В POSIX tulaga masani o le amio a le daemon e le o faamatalaina i soʻo se auala ma naʻo le polokalama faʻaoga e faʻamaonia crontab. O le i ai o masini mo le faʻalauiloaina o galuega a tagata faʻaoga, o le mea moni, faʻaalia, ae le o faʻamatalaina auiliili.

E ala i le vala'au i le crontab utility, e mafai ona e faia ni mea se fa: fa'asa'o le laulau o galuega a le tagata fa'aoga i le fa'atonu, uta le laulau mai se faila, fa'aali le laulau o lo'o iai nei, ma fa'amama le laulau o galuega. Fa'ata'ita'iga o le fa'aogaina o le crontab utility:

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

Ina ua valaauina crontab -e o le a faʻaaogaina le faʻatonu faʻamaonia i le fesuiaiga o le siosiomaga masani EDITOR.

O galuega lava ia o loʻo faʻamatalaina i le faatulagaga lenei:

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

O vaega muamua e lima o faamaumauga: minute [1..60], itula [0..23], aso o le masina [1..31], masina [1..12], aso o le vaiaso [0. .6], lea o le 0 o le Aso Sa. Ole laina mulimuli, ono, ole laina ole a fa'atinoina e le fa'amatala fa'atonu masani.

I totonu o fanua muamua e lima, e mafai ona lisiina tau fa'avasegaina i koma:

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

Po'o se va'aiga:

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

Ole avanoa ole tagata ile fa'atulagaina o galuega o lo'o fa'atulafonoina ile POSIX e le cron.allow ma cron.deny faila, lea e lisi ai tagata e mafai ona maua le crontab ma tagata fa'aoga e aunoa ma le avanoa i le polokalame, i le faasologa. E le fa'atonutonuina e le fa'atonu le nofoaga o nei faila i so'o se auala.

E tusa ai ma le tulaga masani, e le itiiti ifo ma le fa suiga o le siosiomaga e tatau ona pasia i polokalame faʻalauiloa:

  1. HOME - fa'asinomaga a le tagata fa'aoga.
  2. LOGNAME — fa'aoga saini.
  3. PATH o le ala lea e mafai ona e maua ai faʻaoga faʻaoga masani.
  4. SHELL - ala i le fa'aliliu upu fa'aaoga.

O le mea moni, POSIX e leai se tala e uiga i le mea e sau ai tau mo nei fesuiaiga.

Fa'atau sili - Vixie cron 3.0pl1

O le tuaa masani o ituaiga eseese o cron lauiloa o Vixie cron 3.0pl1, na faʻalauiloaina i le lisi o meli comp.sources.unix i le 1992. O le a matou mafaufau i uiga autu o lenei faʻamatalaga i nisi auiliiliga.

Vixie cron e sau i polokalame e lua (cron ma crontab). E pei ona masani ai, o le daemon e nafa ma le faitau ma le faʻatinoina o galuega mai le laulau o galuega ma laulau faʻaoga tagata taʻitoʻatasi, ma o le crontab utility e nafa ma le teuteuina o laulau faʻaoga.

Lisi galuega ma faila fa'atulagaina

O loʻo iai le laulau faʻatonu sili i /etc/crontab. O le syntax o le laulau faʻapipiʻi e fetaui ma le syntax o Vixie cron, sei vagana ai o le koluma lona ono o loʻo faʻaalia ai le igoa o le tagata faʻaoga o loʻo i lalo o le na faʻalauiloaina le galuega:

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

O lo'o iai laulau masani a tagata fa'aoga ile /var/cron/tabs/username ma fa'aoga tutusa le syntax. A e faʻaogaina le crontab utility o se tagata faʻaoga, o faila ia e faʻasaʻo.

O lisi o tagata faʻaoga e mafai ona maua le crontab o loʻo pulea i le / var / cron / allow ma / var / cron / deny faila, lea e te manaʻomia ai le tuʻuina o le igoa faʻaoga i se laina ese.

Fa'aupuga fa'alautele

Fa'atusatusa i le POSIX crontab, o le fofo a Paul Vixey o lo'o i ai le tele o suiga aoga i le syntax o laulau a le aoga.

Ua maua se fa'asologa o laulau fou: mo se fa'ata'ita'iga, e mafai ona e fa'ailoa aso o le vaiaso po'o masina i lou igoa (Mon, Tue, ma isi):

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

E mafai ona e faʻamaonia le laasaga e faʻalauiloa ai galuega:

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

Laasaga ma vaeluaga e mafai ona fefiloi:

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

O lo'o lagolagoina isi fa'aogaina i le fa'asologa masani (toe fa'afou, ta'i tausaga, ta'i tausaga, ta'i masina, ta'i vaiaso, aso ta'itasi, vaeluapo, ta'i itula):

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

Siosiomaga fa'atino galuega

Vixie cron fa'atagaina oe e sui le si'osi'omaga o fa'agasolo talosaga.

Ole fesuiaiga ole siosiomaga USER, LOGNAME ma le HOME e le na o le tuʻuina atu e le daemon, ae e ave mai se faila. sese. Ole suiga ole PATH ua seti ile "/usr/bin:/bin" ma le SHELL fesuia'i ua seti ile "/bin/sh". O tau o fesuiaiga uma sei vagana LOGNAME e mafai ona suia i laulau faʻaoga.

O nisi suiga ole si'osi'omaga (aemaise lava SHELL ma HOME) e fa'aogaina e le cron lava ia e fa'atino ai le galuega. Ole mea lea ole fa'aaogaina o le bash nai lo le sh masani e fa'atino ai galuega fa'ale-aganu'u atonu e foliga mai:

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

Mulimuli ane, o suiga uma o le siosiomaga o loʻo faʻamatalaina i le laulau (faʻaaogaina e le cron pe manaʻomia e le faʻagasologa) o le a pasi atu i le galuega faʻatino.

Ina ia fa'asa'o faila, e fa'aoga e crontab le fa'atonu o lo'o fa'amaoti mai i le VISUAL po'o le EDITOR fesuiaiga o le siosiomaga. Afai o le si'osi'omaga na fa'atautaia ai le crontab e le'o fa'amatalaina nei suiga, ona fa'aaogaina lea o le "/usr/ucb/vi" (atonu o le ucb o le Iunivesite o Kalefonia, Berkeley).

cron i Debian ma Ubuntu

Ua faʻasaʻolotoina e le au atinaʻe o Debian ma faʻasalalauga sili ona suia lomiga Vixie cron version 3.0pl1. E leai se eseesega i le syntax o faila laulau; mo tagata faʻaoga e tutusa Vixie cron. Vaega Fou Sili: Lagolago syslog, SELinux и PAM.

E itiiti le iloa, ae o suiga faʻapitoa e aofia ai le nofoaga o faila faʻatulagaina ma laulau o galuega.

O laulau faʻaoga i Debian o loʻo i totonu o le /var/spool/cron/crontabs directory, o loʻo iai pea le laulau faʻaoga - i /etc/crontab. Debian package-specific task table o loʻo tuʻuina i /etc/cron.d, mai le mea e otometi ai ona faitau e le cron daemon. O le fa'atonuga o tagata fa'aoga e pulea e le /etc/cron.allow ma /etc/cron.deny faila.

O le atigi faaletonu o loʻo i ai pea / bin / sh, lea i Debian o se tamai atigi POSIX-tausi vase, fa'alauiloa e aunoa ma le faitauina o so'o se fa'atulagaga (i le tulaga e le fa'afeso'ota'i).

Cron lava ia i lomiga lata mai o Debian o loʻo faʻalauiloaina e ala i le systemd, ma e mafai ona vaʻaia le faʻatulagaga faʻalauiloa i /lib/systemd/system/cron.service. E leai se mea fa'apitoa i le fa'atulagaina o le 'au'aunaga; so'o se fa'atonuga fa'apitoa e mafai ona faia e ala i suiga o le si'osi'omaga e fa'ailoa sa'o i le crontab o tagata ta'itasi.

cronie i RedHat, Fedora ma CentOS

crony - tui ole Vixie cron version 4.1. E pei o Debian, e leʻi suia le syntax, ae o le lagolago mo PAM ma SELinux, galue i totonu o se fuifui, siaki faila e faʻaaoga ai faʻamatalaga ma isi vaega ua faʻaopoopoina.

O le faʻaoga faʻaletonu o loʻo i totonu o nofoaga masani: o le laulau faʻapipiʻi i /etc/crontab, afifi e tuʻu a latou laulau i /etc/cron.d, faʻaoga laulau e alu i totonu /var/spool/cron/crontabs.

O le daemon e tamoʻe i lalo o le pulega systemd, o le faʻatulagaina o auaunaga o le /lib/systemd/system/crond.service.

I luga o le Red Hat-pei o tufatufa, / bin / sh e faʻaaogaina e ala i le faaletonu i le amataga, o le bash masani. E tatau ona maitauina pe a faʻatautaia galuega cron e ala i / bin / sh, o le bash shell e amata ile POSIX-compliant mode ma e le faitau i soʻo se faʻaopoopoina faʻaopoopo, e taʻavale i le tulaga e le o fesoʻotaʻi.

cronie i SLES ma openSUSE

Le fa'asoa Siamani SLES ma lona fa'atupuina openSUSE fa'aaoga le cronie tutusa. O le daemon iinei o loʻo faʻalauiloaina foi i lalo o le systemd, o le faʻatulagaina o le tautua o loʻo i totonu /usr/lib/systemd/system/cron.service. Fa'atonuga: /etc/crontab, /etc/cron.d, /var/spool/cron/tabs. /bin/sh o le bash lava lea e tasi o lo'o fa'agasolo i le POSIX-compliant non-interactive mode.

Vixie cron masini

O fanau fa'aonaponei o le cron e le'i suia fa'atusatusa i Vixie cron, ae o lo'o maua pea ni foliga fou e le mana'omia e malamalama ai i mataupu o le polokalama. O le tele o nei faʻaopoopoga e le lelei le faʻatulagaina ma fenumiai le code. O le uluai cron source code na saunia e Paul Vixey o se fiafiaga e faitau.

O le mea lea, na ou filifili ai e faʻavasega le masini cron e faʻaaoga ai le faʻataʻitaʻiga o se polokalame cron masani i lala uma e lua o le atinaʻe - Vixie cron 3.0pl1. O le a ou faʻafaigofieina faʻataʻitaʻiga e ala i le aveeseina o ifdefs e faʻalavelave ai le faitau ma le faʻaaogaina o faʻamatalaga laiti.

O le galuega a le temoni e mafai ona vaevaeina i ni vaega:

  1. Polokalame amata.
  2. Aoina ma fa'afouina le lisi o galuega e fa'atino.
  3. O lo'o fa'agasolo le matasele autu.
  4. Amata se galuega.

Sei o tatou vaai ia i latou i le faasologa.

Amataina

A amata, pe a uma ona siaki le faagasologa o finauga, cron faʻapipiʻi le SIGCHLD ma le SIGHUP faʻailoga faailo. O le mea muamua na te faia se faʻamatalaga ogalaau e uiga i le faʻamutaina o le faʻagasologa o tamaiti, o le lona lua e tapunia le faila faila o le faila ogalaau:

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

O le cron daemon e masani ona tamo'e na'o ia i luga o le polokalama, na'o se superuser ma mai le cron directory autu. O valaau nei e fatuina ai se faila loka ma le PID o le daemon process, ia mautinoa e saʻo le tagata faʻaoga ma sui le lisi o loʻo i ai nei i le mea autu:

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

Ua setiina le ala fa'aletonu, lea o le a fa'aaogaina pe a amata faiga:

setenv("PATH", _PATH_DEFPATH, 1);

Ona fai lea o le "fa'ata'ita'i": e faia ai se kopi a tamaiti o le fa'agasologa e ala i le vala'au o le tui ma se sauniga fou i le fa'agasologa o tamaiti (valaau setsid). E le o toe mana'omia le fa'agasologa matua, ma e alu i fafo:

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

O le fa'amutaina o le fa'agasologa o matua e fa'amatu'u ai le loka i le faila loka. E le gata i lea, e manaʻomia le faʻafouina o le PID i le faila i le tamaititi. A maeʻa lea, faʻatumu le faʻamaumauga o galuega i:

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

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

Ona alu lea o le cron i le taamilosaga autu o galuega. Ae a'o le'i faia lena mea, e aoga le va'ai i le utaina o le lisi o galuega.

Aoina ma fa'afouina le lisi o galuega

O le galuega o le load_database e nafa ma le utaina o le lisi o galuega. E siaki le crontab faiga autu ma le lisi ma faila tagata faaaoga. Afai e le'i suia faila ma le fa'atonu, e le toe faitau le lisi o galuega. A leai, o se lisi fou o galuega e amata ona fai.

O lo'o fa'auluina se faila faila ma faila fa'apitoa ma igoa ole laulau:

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

Tu'u ai laulau a tagata fa'aoga i se matasele:

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

A maeʻa ona suia le database tuai i se mea fou.

I faʻataʻitaʻiga o loʻo i luga, o le process_crontab function call e faʻamaonia ai o loʻo i ai se tagata faʻaoga e fetaui ma le igoa faila o le laulau (sei vagana o se superuser) ona valaʻau loa load_user. Ua uma ona faitau e le vaega mulimuli le faila lava ia i lea laina ma lea laina:

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

O iinei, a le o le fesuiaiga o le siosiomaga e setiina (laina o le VAR = tau) e faʻaaoga ai le load_env / env_set galuega, poʻo le faʻamatalaga o galuega e faitau (* * * * * /path/to/exec) e faʻaaoga ai le galuega o le load_entry.

O le vaega faʻapipiʻi e toe foʻi mai load_entry o la matou galuega, lea e tuʻuina i le lisi lautele o galuega. O le galuega lava ia o loʻo faʻatinoina se faʻasologa o upu o le taimi, ae sili atu ona matou fiafia i le faʻatulagaina o fesuiaiga o le siosiomaga ma faʻasologa o galuega:

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

O le matasele autu e galue ma le lisi o loʻo iai nei o galuega.

Mata'u autu

O le uluai cron mai le Version 7 Unix sa galue faigofie lava: na toe faitau le faʻatulagaga i se matasele, faʻalauiloa galuega o le minute o loʻo i ai nei o se superuser, ma moe seia oʻo i le amataga o le isi minute. O lenei auala faigofie i masini tuai e manaʻomia ai le tele o punaoa.

O se isi faʻamatalaga na tuʻuina atu i SysV, lea na alu ai le daemon e moe seʻia oʻo i le minute lata mai lea na faʻamatalaina ai le galuega, pe mo le 30 minute. E itiiti lava punaoa na faʻaaogaina mo le toe faitauina o le faʻatulagaina ma le siakiina o galuega i lenei faiga, ae o le vave faʻafouina o le lisi o galuega na avea ma faʻalavelave.

Na toe foʻi Vixie cron i le siakiina o lisi o galuega e tasi i le minute, o le mea e lelei ai i le faaiuga o le 80s sa i ai le tele o punaoa i masini Unix masani:

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

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

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

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

Ole galuega ole cron_sleep e a'afia sa'o ile fa'atinoina o galuega, vala'au ile job_runqueue (fa'amatala ma fa'atino galuega) ma le do_command (fa'atautaia galuega ta'itasi). O le galuega mulimuli e aoga le suʻesuʻeina atili.

Fa'atino se galuega

O le galuega do_command o loʻo faʻatinoina i se faiga Unix lelei, o lona uiga, e fai se tui e faʻatino ai le galuega e aunoa ma se faʻaogaina. O le faagasologa o matua o loʻo faʻaauau pea ona faʻalauiloa galuega, o le tamaititi e saunia le faagasologa o galuega:

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

E tele naua manatu ile child_process: e manaʻomia tulaga masani ma mea sese e tafe i luga ia te ia lava, ina ia mafai ai ona lafo i meli (pe a fai o le MAILTO siosiomaga fesuiaiga o loʻo faʻamaonia i le laulau galuega), ma, mulimuli ane, faʻatali mo le autu. faagasologa o le galuega e faamaeaina.

O le faagasologa o galuega e faia e se isi tui:

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

O le mea tonu lava lena o le cron. Na ou misia nisi faʻamatalaga manaia, mo se faʻataʻitaʻiga, faʻamatalaga mo tagata faʻaoga mamao, ae na ou faʻamatalaina le mea autu.

Taofi upu

O le Cron o se polokalama faigofie ma aoga, faia i tu ma aga sili ona lelei a le lalolagi Unix. Na te le faia se mea faʻaopoopo, ae o loʻo ia faia lana galuega ma le ofoofogia mo le tele o tausaga i le taimi nei. O le faʻaogaina o le code mo le faʻasologa e sau ma Ubuntu e le sili atu ma le itula, ma sa ou fiafia tele! Ou te faamoemoe na mafai ona ou faasoa atu ia te oe.

Ou te le iloa e uiga ia te oe, ae ua fai si ou faanoanoa i le iloaina o polokalame faaonaponei, faatasi ai ma lona uiga o le soona lavelave ma le soona fai, ua le mafai ona fesoasoani i sea faigofie mo se taimi umi.

E tele auala fa'aonaponei i le cron: systemd-timers e fa'atagaina oe e fa'atulaga faiga fa'apitoa ma fa'alagolago, fcron e fa'atagaina oe e sili atu ona fetu'una'i le fa'atonutonuina o punaoa e ala i galuega. Ae o le tagata lava ia, o le crontab sili ona faigofie sa lava lava mo au.

I se faapuupuuga, alofa ia Unix, faʻaoga polokalame faigofie ma aua neʻi galo e faitau le mana mo lau faʻavae!

puna: www.habr.com

Faaopoopo i ai se faamatalaga