Cron na Linux: akụkọ ihe mere eme, ojiji na ngwaọrụ

Cron na Linux: akụkọ ihe mere eme, ojiji na ngwaọrụ

The kpochapụwo dere na obi ụtọ awa adịghị ekiri. N'oge ọhịa ndị ahụ enweghị ndị mmemme ma ọ bụ Unix, mana taa ndị mmemme maara nke ọma: cron ga-edekọ oge kama ha.

Ngwa ọrụ ahịrị iwu bụ ma adịghị ike yana ọrụ m. sed, awk, wc, ịkpụ na mmemme ochie ndị ọzọ na-eji ederede na sava anyị kwa ụbọchị. Emebere ọtụtụ n'ime ha dị ka ọrụ maka cron, onye nhazi oge sitere na 70s.

Ruo ogologo oge, m na-eji cron eme ihe n'elu, na-enweghị ịbanye na nkọwa, ma otu ụbọchị, mgbe m zutere njehie mgbe m na-agba ọsọ edemede, ekpebiri m ileba anya na ya nke ọma. Otu a ka akụkọ a siri pụta, mgbe m na-ede ya, amaara m POSIX crontab, nhọrọ cron bụ isi na nkesa Linux na-ewu ewu na nhazi nke ụfọdụ n'ime ha.

Ị na-eji Linux ma na-arụ ọrụ cron? Ị nwere mmasị na nhazi ngwa ngwa sistemụ na Unix? Mgbe ahụ, anyị na-na-na anyị ụzọ!

Ihe

Mmalite nke ụdị

Mmegbu nke onye ọrụ ma ọ bụ mmemme nke oge bụ ihe doro anya dị mkpa na sistemụ arụmọrụ niile. Ya mere, programmers ghọtara mkpa ọrụ nke na-enye ha ohere ime atụmatụ na ime ihe aga-eme ogologo oge gara aga.

Sistemu eji arụ ọrụ nke Unix na-achọpụta mmalite ha na ụdị 7 Unix, mepụtara na 70s nke narị afọ gara aga na Bell Labs, gụnyere nke Ken Thompson ama ama. Ụdị 7 Unix tinyekwara cron, ọrụ maka ịrụ ọrụ superuser oge niile.

Ihe omume cron nke oge a bụ mmemme dị mfe, mana algọridim na-arụ ọrụ nke ụdị mbụ ahụ dị mfe karị: ọrụ ahụ na-eteta otu ugboro n'otu nkeji, gụọ tebụl nwere ọrụ sitere na otu faịlụ (/etc/lib/crontab) wee rụọ ọrụ maka lekọta ọrụ ndị ahụ ekwesịrị ịrụ n'oge ugbu a.

N'ikpeazụ, e wetara ụdị ọrụ dị mfe ma baa uru na sistemụ arụmọrụ dịka Unix niile.

Nkọwa zuru oke nke usoro crontab na ụkpụrụ ndị bụ isi nke ọrụ ọrụ ahụ gụnyere n'ụkpụrụ isi nke sistemụ arụmọrụ Unix - POSIX - na 1992, ya mere cron sitere na ọkọlọtọ de facto ghọrọ ọkọlọtọ de jure.

N'afọ 1987, Paul Vixie, onye nyochachara ndị ọrụ Unix banyere ọchịchọ ha maka cron, wepụtara nsụgharị ọzọ nke daemon nke na-edozi ụfọdụ nsogbu nke cron omenala ma gbasaa syntax nke faịlụ tebụl.

Site na ụdị nke atọ nke Vixie cron malitere izute POSIX chọrọ, na mgbakwunye, mmemme ahụ nwere ikikere na-emesapụ aka, ma ọ bụ kama ọ dịghị ikike ọ bụla, ma e wezụga ọchịchọ dị na README: onye edemede anaghị enye nkwa, aha onye edemede. enweghị ike ihichapụ, ma enwere ike ire mmemme ahụ yana koodu isi mmalite. Ihe ndị a chọrọ ka ọ dabara na ụkpụrụ nke sọftụwia efu nke na-enweta ewu ewu n'afọ ndị ahụ, yabụ ụfọdụ nkesa Linux bụ isi nke pụtara na mmalite 90s were Vixie cron dị ka sistemụ ha ma na-emepe ya taa.

Karịsịa, Red Hat na SUSE na-emepụta ndụdụ nke Vixie cron - cronie, na Debian na Ubuntu na-eji mbipụta mbụ nke Vixie cron nwere ọtụtụ patches.

Ka anyị buru ụzọ mata onye ọrụ crontab nke akọwara na POSIX, mgbe nke ahụ gasịrị, anyị ga-eleba anya na ndọtị syntax enyere na Vixie cron na iji ọdịiche nke Vixie cron na nkesa Linux ewu ewu. Na n'ikpeazụ, cherry na achicha bụ nyocha nke ngwaọrụ cron daemon.

POSIX crontab

Ọ bụrụ na cron mbụ na-arụ ọrụ mgbe niile maka superuser, ndị nhazi oge a na-arụkarị ọrụ nke ndị ọrụ nkịtị, nke dị nchebe ma dị mma.

A na-enye crons dị ka usoro mmemme abụọ: cron daemon na-agba ọsọ mgbe niile na akụrụngwa crontab dị maka ndị ọrụ. Nke ikpeazụ na-enye gị ohere dezie tebụl ọrụ kpọmkwem maka onye ọrụ ọ bụla na sistemụ ahụ, ebe daemon na-ebupụta ọrụ sitere na tebụl onye ọrụ na sistemụ.

В Ọkọlọtọ POSIX A kọwaghị omume nke daemon n'ụzọ ọ bụla ma ọ bụ naanị mmemme onye ọrụ ka a na-ahazi crontab. Ịdị adị nke usoro maka ịmalite ọrụ onye ọrụ bụ, n'ezie, pụtara, mana akọwaghị ya n'ụzọ zuru ezu.

Site n'ịkpọ crontab utility, ị nwere ike ime ihe anọ: dezie tebụl ọrụ onye ọrụ na onye nchịkọta akụkọ, buo tebụl na faịlụ, gosi tebụl ọrụ dị ugbu a, ma kpochapụ tebụl ọrụ. Ọmụmaatụ ka crontab utility si arụ ọrụ:

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

Mgbe akpọrọ crontab -e a ga-eji nchịkọta akụkọ akọwapụtara na mgbanwe ọnọdụ gburugburu ebe obibi EDITOR.

A kọwara ọrụ ndị ahụ n'onwe ha n'ụdị a:

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

Akụkụ ise mbụ nke ndekọ: nkeji [1..60], awa [0..23], ụbọchị nke ọnwa [1..31], ọnwa [1..12], ụbọchị nke izu [0. .6], ebe 0 bụ ụbọchị ụka. Ikpeazụ, nke isii, ubi bụ ahịrị nke onye ntụgharị okwu ọkọlọtọ ga-eme.

Na mpaghara ise mbụ, enwere ike ịdepụta ụkpụrụ site na rikoma:

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

Ma ọ bụ jiri akara uko:

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

A na-ahazi ohere onye ọrụ na nhazi oge ọrụ na POSIX site na faịlụ cron.allow na cron.deny, nke depụtara ndị ọrụ nwere ohere ịnweta crontab na ndị ọrụ na-enweghị ohere ịnweta mmemme ahụ, n'otu n'otu. Ọkọlọtọ anaghị ahazi ọnọdụ faịlụ ndị a n'ụzọ ọ bụla.

Dị ka ọkọlọtọ si dị, opekata mpe mgbanwe gburugburu anọ ga-agaferịrị na mmemme ewepụtara:

  1. ỤLỌ - ndekọ ndekọ ụlọ nke onye ọrụ.
  2. LOGNAME - nbanye onye ọrụ.
  3. PATH bụ ụzọ ebe ị nwere ike ịchọta akụrụngwa sistemụ ọkọlọtọ.
  4. SHELL — ụzọ onye ntụgharị iwu ejiri.

N'ụzọ doro anya, POSIX ekwughị ihe ọ bụla gbasara ebe ụkpụrụ maka mgbanwe ndị a si.

Onye na-ere ahịa kacha mma - Vixie cron 3.0pl1

Otu nna ochie nke ụdị cron a ma ama bụ Vixie cron 3.0pl1, ewepụtara na listi nzipu ozi comp.sources.unix na 1992. Anyị ga-atụle isi atụmatụ nke nsụgharị a n'ụzọ zuru ezu karị.

Vixie cron na-abịa na mmemme abụọ (cron na crontab). Dị ka ọ dị na mbụ, daemon na-ahụ maka ịgụ na ịrụ ọrụ site na tebụl ọrụ sistemu na tebụl ọrụ onye ọrụ, yana ọrụ crontab na-ahụ maka idezi tebụl ndị ọrụ.

Tebụl ọrụ na faịlụ nhazi

Tebụlụ ọrụ superuser dị na /etc/crontab. Okwu syntax nke tebụl sistemụ kwekọrọ na syntax nke Vixie cron, ewezuga na kọlụm nke isii dị na ya na-egosi aha onye ọrụ n'okpuru aha ya ka ewepụtara ọrụ ahụ:

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

Tebụl ọrụ onye ọrụ oge niile dị na /var/cron/tabs/aha njirimara wee jiri otu syntax. Mgbe ị na-agba ọsọ crontab utility dị ka onye ọrụ, ndị a bụ faịlụ ndị edeziri.

A na-ejikwa ndepụta nke ndị ọrụ nwere ohere ịnweta crontab na /var/cron/allow and /var/cron/ deny faịlụ, ebe naanị ị chọrọ itinye aha njirimara na ahịrị dị iche.

agbatịkwuru syntax

E jiri ya tụnyere POSIX crontab, ngwọta Paul Vixey nwere ọtụtụ mgbanwe bara uru na syntax nke tebụl ọrụ ọrụ.

Ọhụrụ syntax okpokoro adịla: dịka ọmụmaatụ, ị nwere ike dee ụbọchị nke izu ma ọ bụ ọnwa n'aha (Mon, Tue, na ndị ọzọ):

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

Ị nwere ike ịkọwa usoro a ga-esi malite ọrụ:

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

Enwere ike ịgwakọta nzọụkwụ na etiti oge:

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

A na-akwado usoro ntụgharị uche maka usoro syntax a na-emebu (ịmalitegharịa, kwa afọ, kwa afọ, kwa ọnwa, kwa izu, kwa ụbọchị, etiti abalị, elekere):

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

gburugburu ebe mmezu ọrụ

Vixie cron na-enye gị ohere ịgbanwe gburugburu ebe ngwa na-agba ọsọ.

Ọ bụghị naanị daemon nyere ndị USER, LOGNAME na HOME mgbanwe gburugburu ebe obibi, kama a na-ewepụta ya na faịlụ. passwd. A na-edozi mgbanwe PATH ka ọ bụrụ "/ usr/bin:/bin" na SHELL agbanwere ka ọ bụrụ "/ bin/sh". Enwere ike ịgbanwe ụkpụrụ nke mgbanwe niile ma e wezụga LOGNAME na tebụl onye ọrụ.

Ụfọdụ mgbanwe gburugburu ebe obibi (ọkachasị SHELL na HOME) ka cron n'onwe ya na-eji arụ ọrụ ahụ. Nke a bụ ihe iji bash kama iji ọkọlọtọ sh iji rụọ ọrụ omenala nwere ike ịdị ka:

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

N'ikpeazụ, mgbanwe niile nke gburugburu ebe obibi akọwapụtara na tebụl (nke cron na-eji ma ọ bụ mkpa nke usoro ahụ) ga-agafe na ọrụ na-agba ọsọ.

Iji dezie faịlụ, crontab na-eji nchịkọta akụkọ akọwapụtara na mgbanwe gburugburu VISUAL ma ọ bụ EDITOR. Ọ bụrụ na gburugburu ebe a na-agba crontab enweghị nkọwapụta mgbanwe ndị a, mgbe ahụ a na-eji "/ usr/ ucb/vi" (ucb bụ eleghị anya Mahadum California, Berkeley).

cron na Debian na Ubuntu

Ndị mmepe nke Debian na nkesa ewepụtala ụdị agbanweela nke ukwuu Ụdị Vixie cron 3.0pl1. Enweghị ọdịiche dị na syntax nke faịlụ tebụl; maka ndị ọrụ ọ bụ otu Vixie cron. Akụkụ ọhụrụ kachasị ukwuu: Nkwado syslog, SELinux и Pam.

A na-ahụta nke ọma, mana mgbanwe a na-ahụ anya na-agụnye ebe faịlụ nhazi na tebụl ọrụ.

Tebụl ndị ọrụ na Debian dị na / var/spool/cron/crontabs directory, tebụl usoro ka dị - na /etc/crontab. A na-edobe tebụl ọrụ akọwapụtara nke Debian na /etc/cron.d, site na ebe cron daemon na-agụ ha ozugbo. A na-achịkwa njikwa ohere onye ọrụ site na faịlụ /etc/cron.allow na /etc/cron.deny.

Shei ndabara ka bụ /bin/sh, nke dị na Debian bụ obere shei na-akwado POSIX gbaara, ewepụtara na-agụghị nhazi ọ bụla (na ọnọdụ enweghị mmekọrịta).

A na-ewepụta Cron n'onwe ya na ụdị Debian kachasị ọhụrụ site na sistemụ, yana enwere ike ịlele nhazi mmalite na /lib/systemd/system/cron.service. Ọ nweghị ihe pụrụ iche na nhazi ọrụ; enwere ike ịme njikwa ọrụ ọ bụla dị nro site na mgbanwe gburugburu ebe ekwuputara ozugbo na crontab nke onye ọrụ ọ bụla.

cronie na RedHat, Fedora na CentOS

Nnenna ndụdụ nke Vixie cron ụdị 4.1. Dị ka ọ dị na Debian, syntax agbanwebeghị, mana nkwado maka PAM na SELinux, na-arụ ọrụ n'ime ụyọkọ, na-enyocha faịlụ site na iji inotify na ihe ndị ọzọ agbakwunyere.

Nhazi ndabara dị na ebe a na-emekarị: tebụl usoro dị na /etc/crontab, ngwugwu na-etinye tebụl ha na /etc/cron.d, tebụl ndị ọrụ na-abanye /var/spool/cron/crontabs.

Daemon na-agba n'okpuru njikwa sistemụ, nhazi ọrụ bụ /lib/systemd/system/crond.service.

Na nkesa Red Hat, / bin/sh na-eji ndabara na mmalite, nke bụ ọkọlọtọ bash. Ekwesiri ighota na mgbe a na-aru oru cron site na / bin / sh, shei bash na-amalite na POSIX-compliant mode ma ghara iguta nhazi nke ozo, na-aru oru na onodu mmekorita.

cronie na SLES na openSUSE

Nkesa German SLES na openSUSE ewepụtara ya na-eji otu cronie. A na-ewepụtakwa daemon ebe a n'okpuru systemd, nhazi ọrụ dị na /usr/lib/systemd/system/cron.service. Nhazi: /etc/crontab, /etc/cron.d, /var/spool/cron/tabs. / bin/sh bụ otu bash na-agba ọsọ na ọnọdụ POSIX na-akwadoghị.

Vixie cron ngwaọrụ

Ụmụ cron nke oge a agbanwebeghị nke ukwuu ma e jiri ya tụnyere Vixie cron, mana ka nwetara atụmatụ ọhụrụ nke na-achọghị ịghọta ụkpụrụ nke mmemme ahụ. Ọtụtụ n'ime ndọtị ndị a emebere nke ọma ma na-agbagha koodu ahụ. Koodu isi mmalite cron nke Paul Vixey bụ ihe ụtọ ịgụ.

Ya mere, ekpebiri m inyocha ngwaọrụ cron site na iji ihe atụ nke mmemme cron na-ahụkarị na ngalaba mmepe abụọ - Vixie cron 3.0pl1. M ga-eme ka ihe atụ ndị a dị mfe site na iwepu ifdefs nke na-esiri ike ịgụ akwụkwọ na ịhapụ obere nkọwa.

Enwere ike kewaa ọrụ mmụọ ọjọọ n'ọtụtụ usoro:

  1. Mmalite mmemme.
  2. Ịnakọta na imelite ndepụta ọrụ ị ga-arụ.
  3. Isi cron loop na-agba ọsọ.
  4. Malite otu ọrụ.

Ka anyị leba anya n’usoro ha.

Nmalite

Mgbe ebidochara, ka ịlele arụmụka usoro, cron na-etinye ndị na-ahụ maka mgbama SIGCHLD na SIGHUP. Nke mbụ na-eme ntinye ndekọ banyere nkwụsị nke usoro nwatakịrị, nke abụọ na-emechi onye na-akọwa faịlụ nke faịlụ ndekọ:

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

Cron daemon na-agba naanị ya na sistemụ, naanị dị ka onye na-ahụ maka njikwa yana site na ndekọ ndekọ cron. Oku ndị a na-emepụta faịlụ mkpọchi na PID nke usoro daemon, jide n'aka na onye ọrụ ahụ ziri ezi ma gbanwee ndekọ ndekọ ugbu a na nke bụ isi:

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

Edebere ụzọ ndabara, nke a ga-eji mgbe ịmalite usoro:

setenv("PATH", _PATH_DEFPATH, 1);

Mgbe ahụ, usoro ahụ bụ "daemonized": ọ na-emepụta otu nwa nke usoro site na ịkpọ ndụdụ na nnọkọ ọhụrụ na usoro nwatakịrị (ịkpọ setsid). Usoro nne na nna adịghịzi mkpa, ọ na-apụ:

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

Nkwụsị usoro nne na nna na-ahapụ mkpọchi na faịlụ mkpọchi. Na mgbakwunye, achọrọ imelite PID na faịlụ ahụ nye nwatakịrị ahụ. Mgbe nke a gasịrị, a na-ejupụta na nchekwa data ọrụ:

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

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

Mgbe ahụ cron na-aga n'ihu na okirikiri ọrụ isi. Mana tupu nke ahụ, ọ bara uru ileba anya na nbudata ndepụta ọrụ.

Ịnakọta na imelite ndepụta ọrụ

Ọrụ load_database bụ maka ibunye ndepụta ọrụ. Ọ na-eji faịlụ onye ọrụ na-enyocha isi usoro crontab yana ndekọ. Ọ bụrụ na faịlụ na ndekọ agbanwebeghị, a naghị agụgharị ndepụta ọrụ. Ma ọ bụghị ya, ndepụta ọrụ ọhụrụ amalite ịmalite.

Na-eburu faịlụ sistemụ nwere faịlụ pụrụ iche na aha tebụl:

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

Na-ebu tebụl onye ọrụ na 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);
}

Mgbe nke ahụ gasịrị, a na-eji nke ọhụrụ dochie nchekwa data ochie.

N'ihe atụ ndị dị n'elu, oku ọrụ process_crontab na-achọpụta na onye ọrụ dabara na aha faịlụ tebụl dị (ọ gwụla ma ọ bụ superuser) wee kpọọ load_user. Nke ikpeazụ agụọlarị faịlụ ahụ n'onwe ya site na ahịrị:

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

N'ebe a, a na-edozi mgbanwe gburugburu ebe obibi (ahịrị nke ụdị VAR = uru) site na iji ọrụ load_env / env_set, ma ọ bụ na-agụ nkọwa ọrụ (* * * * * / ụzọ / na / exec) site na iji ọrụ load_entry.

Ngwa ntinye nke load_entry na-alaghachi bụ ọrụ anyị, nke etinyere na ndepụta ọrụ niile. Ọrụ ahụ n'onwe ya na-eme nyocha ngwa ngwa nke usoro oge, mana anyị nwere mmasị karịa n'ichepụta mgbanwe gburugburu ebe obibi na usoro mmalite ọrụ:

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

Isi loop na-arụ ọrụ na ndepụta ọrụ dị ugbu a.

Isi loop

Cron mbụ sitere na Version 7 Unix rụrụ ọrụ nke ọma: ọ gụgharịrị nhazi ahụ na akaghị aka, wepụta ọrụ nke nkeji dị ugbu a dị ka onye njikwa, wee hie ụra ruo mmalite nkeji na-esote. Ụzọ a dị mfe na igwe ochie chọrọ ọtụtụ ihe onwunwe.

A tụrụ aro ụdị ọzọ na SysV, nke daemon na-arahụ ụra ma ọ bụ ruo nkeji kacha nso nke akọwapụtara ọrụ ahụ, ma ọ bụ maka nkeji iri atọ. A na-eri ihe ole na ole maka ịgụgharị nhazi na ịlele ọrụ na ọnọdụ a, mana imelite ndepụta ọrụ ngwa ngwa ghọrọ ihe na-adịghị mma.

Vixie cron laghachiri na ịlele ndepụta ọrụ otu ugboro n'otu nkeji, ọ dabara nke ọma na njedebe nke 80s enwere nnukwu ego karịa na igwe Unix ọkọlọtọ:

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

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

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

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

Ọrụ cron_sleep na-etinye aka na ịrụ ọrụ, na-akpọ ọrụ_runqueue (gụọ ma rụọ ọrụ) yana ime_command (na-arụ ọrụ nke ọ bụla). Ọrụ ikpeazụ kwesịrị inyocha n'ụzọ zuru ezu.

Na-arụ ọrụ

A na-arụ ọrụ do_command n'ụdị Unix dị mma, ya bụ, ọ na-eme ndụdụ iji rụọ ọrụ ahụ n'otu n'otu. Usoro nne na nna na-aga n'ihu ịmalite ọrụ, usoro ụmụaka na-akwadebe usoro ọrụ:

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

Enwere ọtụtụ echiche dị na child_process: ọ na-ewepụta mmepụta ọkọlọtọ na iyi njehie n'onwe ya, iji zipu ya na mail (ọ bụrụ na akọwapụtara ọnọdụ gburugburu MAILTO na tebụl ọrụ), na, n'ikpeazụ, chere maka isi. usoro nke ọrụ iji wuchaa.

A na-emepụta usoro ọrụ site na ndụdụ ọzọ:

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

Nke ahụ bụ ihe niile cron bụ. E wepụrụ m nkọwa ụfọdụ na-adọrọ mmasị, dịka ọmụmaatụ, ịza ajụjụ maka ndị ọrụ dịpụrụ adịpụ, mana m depụtara isi ihe.

Afterword

Cron bụ ihe ịtụnanya dị mfe na mmemme bara uru, nke emere na ọdịnala kachasị mma nke ụwa Unix. Ọ naghị eme ihe ọ bụla ọzọ, mana ọ na-arụ ọrụ ya nke ọma kemgbe ọtụtụ iri afọ ugbu a. Ị nweta koodu maka ụdị nke na-abịa na Ubuntu ewereghị ihe karịrị otu awa, enwere m obi ụtọ! Enwere m olileanya na m nwere ike ịkọrọ gị ya.

Amaghị m banyere gị, ma ọ dị m ntakịrị mwute ịghọta na mmemme nke oge a, na-enwekarị mgbagwoju anya na nke na-adịghị ahụkebe, adịghị akwado ịdị mfe dị otú ahụ ogologo oge.

Enwere ọtụtụ ụzọ ọgbara ọhụrụ maka cron: sistemu-timers na-enye gị ohere ịhazi sistemu siri ike na ịdabere na ya, fcron na-enye gị ohere ijikwa ọrụ na-agbanwe agbanwe nke oriri akụrụngwa. Mana n'onwe ya, crontab kachasị mfe na-ezuru m mgbe niile.

Na nkenke, hụrụ Unix n'anya, jiri mmemme dị mfe ma echefula ịgụ mana maka ikpo okwu gị!

isi: www.habr.com

Tinye a comment