Cron ma Linux: ka mōʻaukala, ka hoʻohana a me ka mea hana

Cron ma Linux: ka mōʻaukala, ka hoʻohana a me ka mea hana

Ua kākau ka mea kahiko i nā hola hauʻoli e nānā ʻole. I kēlā mau wā hihiu ʻaʻohe mea papahana a ʻaʻole hoʻi ʻo Unix, akā i kēia lā ua ʻike maopopo nā mea polokalamu: e mālama ʻo cron i ka manawa ma kahi o lākou.

ʻO nā pono laina kauoha he nāwaliwali a he hana noʻu. sed, awk, wc, cut a me nā polokalamu kahiko ʻē aʻe e holo ʻia e nā palapala ma kā mākou mau kikowaena i kēlā me kēia lā. Hoʻolālā ʻia ka hapa nui o lākou e like me nā hana no cron, kahi mea hoʻonohonoho i hoʻomaka mai ka 70s.

No ka manawa lōʻihi ua hoʻohana au i ka cron me ka ʻole o ka hele ʻana i nā kikoʻī, akā i kekahi lā, i ka wā i loaʻa ai iaʻu kahi hewa i ka wā e holo ana i kahi palapala, ua hoʻoholo wau e nānā pono iā ia. ʻO kēia ke ʻano o kēia ʻatikala, ʻoiai e kākau ana ua kamaʻāina wau i ka POSIX crontab, nā koho cron nui i nā māhele Linux kaulana a me ke ʻano o kekahi o lākou.

Ke hoʻohana nei ʻoe i Linux a ke holo nei i nā hana cron? Makemake ʻoe i ka ʻōnaehana noi pūnaewele ma Unix? A laila, hele mākou!

Nā mea

Ke kumu o nā laha

ʻO ka hoʻokō ʻana i nā mea hoʻohana a i ʻole nā ​​polokalamu ʻōnaehana he mea pono i nā ʻōnaehana hana āpau. No laila, ua ʻike ka poʻe programmer i ka pono o nā lawelawe e hiki ai iā lākou ke hoʻolālā kikowaena a hoʻokō i nā hana i ka wā ma mua.

Hiki i nā ʻōnaehana hana like me Unix ke ʻike i ko lākou kumu i ka Version 7 Unix, i hoʻomohala ʻia i nā makahiki 70 o ke kenekulia hope ma Bell Labs, me ka mea kaulana ʻo Ken Thompson. Hoʻokomo pū ʻia ʻo 7 Unix i ka cron, kahi lawelawe no ka holo mau ʻana i nā hana superuser.

He polokalamu maʻalahi ka cron hou, akā ʻoi aku ka maʻalahi o ka algorithm hana o ka mana kumu: ala ka lawelawe i hoʻokahi minuke, heluhelu i kahi papa me nā hana mai kahi faila (/etc/lib/crontab) a hana ʻia no ka superuser kēlā mau hana i hana ʻia i kēia manawa.

Ma hope mai, ua hoʻolako ʻia nā mana maikaʻi o ka lawelawe maʻalahi a me ka pono me nā ʻōnaehana hana like Unix.

ʻO nā wehewehe kikoʻī o ke ʻano crontab a me nā kumu kumu o ka hana o ka pono i hoʻokomo ʻia i loko o ka maʻamau nui o nā ʻōnaehana hana like me Unix - POSIX - ma 1992, a no laila ua lilo ka cron mai kahi maʻamau de facto i maʻamau de jure.

I ka makahiki 1987, ua noiʻi ʻo Paul Vixie i nā mea hoʻohana Unix e pili ana i kā lākou makemake no cron, ua hoʻokuʻu i kahi mana hou o ka daemon i hoʻoponopono i kekahi o nā pilikia o ka cron kuʻuna a hoʻonui i ka syntax o nā faila papa.

Ma ke kolu o ka mana o Vixie cron ua hoʻomaka e hoʻokō i nā koi POSIX, ʻo ia hoʻi, ua loaʻa i ka papahana kahi laikini liberal, a i ʻole, ʻaʻohe laikini i nā mea āpau, koe wale nō nā makemake i ka README: ʻaʻole hāʻawi ka mea kākau i nā hōʻoia, ka inoa o ka mea kākau. ʻAʻole hiki ke hoʻopau ʻia, a hiki ke kūʻai ʻia ka polokalamu me ke code kumu. Ua kūpono kēia mau koi me nā loina o ka polokalamu manuahi e loaʻa ana i ka kaulana i kēlā mau makahiki, no laila kekahi o nā māhele Linux koʻikoʻi i ʻike ʻia i ka 90s mua i lawe iā Vixie cron i kā lākou ʻōnaehana hoʻokahi a ke hoʻomohala nei i kēia lā.

Ma keʻano kūikawā, ua hoʻomohala ʻo Red Hat a me SUSE i kahi mākia o Vixie cron - cronie, a hoʻohana ʻo Debian a me Ubuntu i ka paʻi kumu mua o Vixie cron me nā ʻāpana he nui.

E ʻike mua kākou i ka crontab hoʻohana mea hoʻohana i wehewehe ʻia ma POSIX, a laila e nānā mākou i nā hoʻonui syntax i hāʻawi ʻia ma Vixie cron a me ka hoʻohana ʻana i nā ʻano like ʻole o Vixie cron i nā hoʻolaha Linux kaulana. A ʻo ka hope, ʻo ka cherry ma ka pōpō ka nānā ʻana o ka cron daemon device.

POSIX crontab

Inā hana mau ka cron kumu no ka superuser, hana pinepine nā mea hoʻonohonoho hou i nā hana a nā mea hoʻohana maʻamau, ʻoi aku ka palekana a me ka maʻalahi.

Hāʻawi ʻia nā Crons ma ke ʻano he hoʻonohonoho o nā papahana ʻelua: ka cron daemon e holo mau nei a me ka pono crontab i loaʻa i nā mea hoʻohana. Hāʻawi ka mea hope iā ʻoe e hoʻoponopono i nā papa hana kikoʻī i kēlā me kēia mea hoʻohana i ka ʻōnaehana, ʻoiai ka daemon e hoʻomaka i nā hana mai ka mea hoʻohana a me nā papa ʻōnaehana.

В POSIX maʻamau ʻAʻole i wehewehe ʻia ke ʻano o ka daemon ma kekahi ʻano a ʻo ka polokalamu hoʻohana wale nō i hoʻokumu ʻia crontab. ʻO ka loaʻa ʻana o nā mīkini no ka hoʻomaka ʻana i nā hana mea hoʻohana, ʻoiaʻiʻo, i hoʻohālikelike ʻia, akā ʻaʻole i wehewehe kikoʻī ʻia.

Ma ke kāhea ʻana i ka pono crontab, hiki iā ʻoe ke hana i ʻehā mau mea: hoʻoponopono i ka papa hana o ka mea hoʻohana i ka mea hoʻoponopono, hoʻouka i ka papaʻaina mai kahi faila, hōʻike i ka papa hana o kēia manawa, a hoʻomaʻemaʻe i ka papa hana. Nā laʻana o ka hana ʻana o ka pono crontab:

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

Ke kāhea ʻia crontab -e e hoʻohana ʻia ka mea hoʻoponopono i hōʻike ʻia i loko o ka hoʻololi kaiapuni maʻamau EDITOR.

Ua wehewehe ʻia nā hana ponoʻī ma ke ʻano penei:

# строки-комментарии игнорируются
#
# задача, выполняемая ежеминутно
* * * * * /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 nā māhele mua ʻelima o nā moʻolelo: minuke [1..60], hola [0..23], lā o ka mahina [1..31], mahina [1..12], mau lā o ka pule [0. .6], kahi 0 ka Sabati. ʻO ka hope, ʻeono, kahua kahi laina e hoʻokō ʻia e ka unuhi ʻōlelo kauoha maʻamau.

Ma nā kahua ʻelima mua, hiki ke helu ʻia nā waiwai i hoʻokaʻawale ʻia e nā koma:

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

A i ʻole me ka hyphen:

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

Hoʻoponopono ʻia ke komo ʻana o ka mea hoʻohana i ka hoʻonohonoho hana ma POSIX e nā faila cron.allow a me cron.deny, e papa inoa i nā mea hoʻohana me ka crontab a me nā mea hoʻohana me ke komo ʻole i ka papahana, kēlā me kēia. ʻAʻole hoʻoponopono ka maʻamau i kahi o kēia mau faila ma kekahi ʻano.

E like me ka maʻamau, pono e hāʻawi ʻia i ʻehā mau ʻano hoʻololi kaiapuni i nā papahana i hoʻokumu ʻia:

  1. HOME - ka papa kuhikuhi home o ka mea hoʻohana.
  2. LOGNAME — komo ka mea hoʻohana.
  3. ʻO PATH ke ala e hiki ai iā ʻoe ke loaʻa nā pono ʻōnaehana maʻamau.
  4. SHELL — ala i ka unuhi kauoha i hoʻohana ʻia.

ʻO ka mea nui, ʻaʻole ʻōlelo ʻo POSIX e pili ana i kahi e hele mai ai nā waiwai no kēia mau ʻano.

ʻO ka mea kūʻai aku maikaʻi loa - Vixie cron 3.0pl1

ʻO ka kūpuna maʻamau o nā ʻano cron kaulana ʻo Vixie cron 3.0pl1, i hoʻokomo ʻia ma ka papa inoa leka uila comp.sources.unix i ka makahiki 1992. E noʻonoʻo mākou i nā hiʻohiʻona nui o kēia mana i nā kikoʻī hou aku.

Hele mai ʻo Vixie cron i ʻelua papahana (cron a me crontab). E like me ka mea maʻamau, na ka daemon ke kuleana no ka heluhelu a me ka holo ʻana i nā hana mai ka papa hana ʻōnaehana a me nā papa hana mea hoʻohana pākahi, a ʻo ka crontab ponoʻī ke kuleana no ka hoʻoponopono ʻana i nā papa hoʻohana.

ʻO ka papa hana a me nā faila hoʻonohonoho

Aia ka papa hana superuser ma /etc/crontab. ʻO ka syntax o ka papa ʻōnaehana e pili ana i ka syntax o Vixie cron, koe naʻe ka kolamu ʻeono i loko o ia mea e hōʻike ana i ka inoa o ka mea hoʻohana ma lalo o ka mea i hoʻomaka ai ka hana:

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

Aia nā papa hana hoʻohana maʻamau i /var/cron/tabs/inoa inoa a hoʻohana i ka syntax like. Ke holo ʻoe i ka pono crontab ma ke ʻano he mea hoʻohana, ʻo ia nā faila i hoʻoponopono ʻia.

Mālama ʻia nā papa inoa o nā mea hoʻohana me ka crontab ma ka /var/cron/allow a me /var/cron/deny faila, kahi e pono ai ʻoe e hoʻokomo i ka inoa mea hoʻohana ma kahi laina ʻokoʻa.

Hoʻonui ʻia ka syntax

Hoʻohālikelike ʻia me POSIX crontab, loaʻa i ka hopena a Paul Vixey kekahi mau hoʻololi pono loa i ka syntax o nā papa hana pono.

Ua loaʻa kahi syntax papa hou: no ka laʻana, hiki iā ʻoe ke kuhikuhi i nā lā o ka pule a i ʻole nā ​​mahina ma ka inoa (Mon, Poʻa, a pēlā aku):

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

Hiki iā ʻoe ke kuhikuhi i ke ala e hoʻomaka ai nā hana:

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

Hiki ke hoʻohui ʻia nā ʻanuʻu a me nā waena:

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

Kākoʻo ʻia nā ʻokoʻa intuitive i ka syntax maʻamau (reboot, makahiki, makahiki, mahina, pule, kēlā me kēia lā, ke aumoe, ka hola):

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

Kaiapuni hoʻokō hana

Hiki iā Vixie cron ke hoʻololi i ke kaiapuni o nā noi holo.

ʻAʻole hāʻawi wale ʻia nā mea hoʻololi kaiapuni USER, LOGNAME a me HOME e ka daemon, akā lawe ʻia mai kahi faila. helena. Hoʻonohonoho ʻia ka hoʻololi PATH i "/ usr / bin: / bin" a ua hoʻonohonoho ʻia ka ʻano SHELL i "/ bin / sh". Hiki ke hoʻololi ʻia nā waiwai o nā mea hoʻololi a pau koe LOGNAME i nā papa hoʻohana.

Hoʻohana ʻia kekahi mau mea hoʻololi kaiapuni (ʻoi aku ka nui o SHELL a me HOME) e cron ponoʻī e holo i ka hana. Eia ke ʻano o ka hoʻohana ʻana i ka bash ma mua o ka sh maʻamau e holo i nā hana maʻamau.

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

ʻO ka hope loa, e hāʻawi ʻia nā ʻano hoʻololi kaiapuni a pau i wehewehe ʻia i ka papaʻaina (hoʻohana ʻia e cron a i ʻole pono e ke kaʻina hana) i ka hana holo.

No ka hoʻoponopono ʻana i nā faila, hoʻohana ʻo crontab i ka mea hoʻoponopono i hōʻike ʻia ma ka hoʻololi kaiapuni VISUAL a i ʻole EDITOR. Inā ʻaʻole i wehewehe ʻia kēia mau ʻano hoʻololi i ke kaiapuni kahi i holo ai crontab, a laila hoʻohana ʻia "/usr/ucb/vi" (ʻo ia paha ke Kulanui o Kaleponi, Berkeley).

cron ma Debian a me Ubuntu

Ua hoʻokuʻu ʻia nā mea hoʻomohala o Debian a me nā derivative distribution mana hoʻololi loa Vixie cron version 3.0pl1. ʻAʻohe ʻokoʻa i ka syntax o nā faila papa; no nā mea hoʻohana ʻo ia ka Vixie cron like. Hiʻona Hou Nui loa: Kākoʻo syslog, SELinux и Pam.

ʻAʻole hiki ke ʻike ʻia, akā ʻo nā hoʻololi ʻike ʻia e pili ana i kahi o nā faila hoʻonohonoho a me nā papa hana.

Aia nā papa hoʻohana ma Debian i ka papa kuhikuhi / var/spool/cron/crontabs, aia nō ka papa ʻōnaehana - ma /etc/crontab. Hoʻokomo ʻia nā papa hana kikoʻī ʻo Debian i /etc/cron.d, mai kahi e heluhelu ai ka cron daemon iā lākou. Hoʻomalu ʻia ka mana o ka mea hoʻohana e nā faila /etc/cron.allow a me /etc/cron.deny.

ʻO ka pūpū paʻamau ka / bin / sh, aia ma Debian kahi pūpū liʻiliʻi POSIX ulupaia, hoʻokuʻu ʻia me ka heluhelu ʻole ʻana i kekahi hoʻonohonoho (ma ke ʻano non-interactive mode).

Hoʻokuʻu ʻia ʻo Cron iā ia iho i nā mana hou o Debian ma o systemd, a hiki ke ʻike ʻia ka hoʻonohonoho hoʻonohonoho ma /lib/systemd/system/cron.service. ʻAʻohe mea kūikawā i ka hoʻonohonoho lawelawe; hiki ke hana ʻia kekahi hoʻokele hana maʻalahi ma o nā ʻano hoʻololi kaiapuni i haʻi pololei ʻia ma ka crontab o kēlā me kēia mea hoʻohana.

cronie ma RedHat, Fedora a me CentOS

crony - ka mākia o Vixie cron version 4.1. E like me Debian, ʻaʻole i loli ka syntax, akā ua kākoʻo ʻia ke kākoʻo no PAM a me SELinux, e hana ana i kahi pūʻulu, nā faila me ka hoʻohana ʻana i ka inotify a ua hoʻohui ʻia nā hiʻohiʻona ʻē aʻe.

Aia ka hoʻonohonoho paʻamau ma nā wahi maʻamau: aia ka papa ʻōnaehana ma /etc/crontab, hoʻokomo nā pūʻolo i kā lākou mau papa ma /etc/cron.d, hele nā ​​papa mea hoʻohana /var/spool/cron/crontabs.

Holo ka daemon ma lalo o ka mana systemd, ʻo ka hoʻonohonoho lawelawe ʻo /lib/systemd/system/crond.service.

Ma ka hāʻawi ʻana i ka Red Hat-like, / bin / sh i hoʻohana ʻia e ka paʻamau i ka hoʻomaka ʻana, ʻo ia ka bash maʻamau. Pono e hoʻomaopopo ʻia i ka wā e holo ana i nā hana cron ma o / bin / sh, hoʻomaka ka bash shell ma ke ʻano POSIX-compliant a ʻaʻole heluhelu i kahi hoʻonohonoho hou, e holo ana ma ke ʻano non-interactive mode.

cronie ma SLES a me openSUSE

ʻO ka hāʻawi Kelemānia SLES a me kāna derivative openSUSE hoʻohana i ka cronie like. Hoʻokuʻu ʻia ka daemon ma lalo o systemd, aia ka hoʻonohonoho lawelawe ma /usr/lib/systemd/system/cron.service. Hoʻonohonoho: /etc/crontab, /etc/cron.d, /var/spool/cron/tabs. /bin/sh ʻo ia ka bash like e holo ana i ka POSIX-compliant non-interactive mode.

Vixie cron mea

ʻAʻole i loli nui nā mamo o cron i kēia manawa i ka hoʻohālikelike ʻia me Vixie cron, akā loaʻa nō naʻe nā hiʻohiʻona hou ʻaʻole pono e hoʻomaopopo i nā kumu o ka papahana. Hoʻolālā maikaʻi ʻole ʻia ka nui o kēia mau hoʻonui a huikau i ke code. He leʻaleʻa ka heluhelu ʻana i ka code kumu kumu cron na Paul Vixey.

No laila, ua hoʻoholo wau e nānā i ka mea cron me ka hoʻohana ʻana i ka laʻana o kahi papahana cron maʻamau i nā lālā ʻelua o ka hoʻomohala - Vixie cron 3.0pl1. E maʻalahi wau i nā hiʻohiʻona ma ka wehe ʻana i nā ifdefs e paʻakikī i ka heluhelu ʻana a me ka haʻalele ʻana i nā kikoʻī liʻiliʻi.

Hiki ke hoʻokaʻawale ʻia ka hana a ka daimonio i kekahi mau pae:

  1. Hoʻomaka papahana.
  2. ʻOhi a hoʻonui i ka papa inoa o nā hana e holo ai.
  3. Ke holo nei ka loop cron nui.
  4. E hoʻomaka i kahi hana.

E nānā kākou iā lākou ma ke ʻano.

Hoʻomaka

I ka hoʻomaka ʻana, ma hope o ka nānā ʻana i nā hoʻopaʻapaʻa kaʻina hana, hoʻokomo ʻo cron i nā mea hōʻailona SIGCHLD a me SIGHUP. ʻO ka mea mua e hana i kahi moʻolelo e pili ana i ka pau ʻana o ke kaʻina hana keiki, ʻo ka mea ʻelua e pani i ka wehewehe faila o ka faila log:

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

Holo wale ka cron daemon ma ka ʻōnaehana, ma ke ʻano he superuser a mai ka papa kuhikuhi cron nui. Ke hana nei nā kelepona i kahi faila laka me ka PID o ke kaʻina daemon, e hōʻoia i ka pololei o ka mea hoʻohana a hoʻololi i ka papa kuhikuhi o kēia manawa i ka mea nui:

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

Hoʻonohonoho ʻia ke ala paʻamau, e hoʻohana ʻia i ka wā e hoʻomaka ai i nā kaʻina hana:

setenv("PATH", _PATH_DEFPATH, 1);

A laila ua "daemonized" ke kaʻina hana: hana ia i kahi kope keiki o ke kaʻina hana ma ke kāhea ʻana i ka fork a me kahi kau hou i ke kaʻina keiki (kahea setsid). ʻAʻole pono ke kaʻina hana makua, a puka i waho:

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

Hoʻopau ʻia ke kaʻina hana makua e hoʻokuʻu i ka laka ma ka faila laka. Eia hou, pono e hoʻonui i ka PID i ka faila i ke keiki. Ma hope o kēia, hoʻopiha ʻia ka waihona hana:

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

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

A laila neʻe ka cron i ka pōʻai hana nui. Akā ma mua o kēlā, pono e nānā i ka hoʻouka ʻana i ka papa inoa hana.

ʻOhi a hōʻano hou i ka papa inoa hana

ʻO ka hana load_database ke kuleana no ka hoʻouka ʻana i ka papa inoa o nā hana. Nānā ia i ka crontab pūnaewele nui a me ka papa kuhikuhi me nā faila mea hoʻohana. Inā ʻaʻole i loli nā faila a me ka papa kuhikuhi, ʻaʻole heluhelu hou ʻia ka papa hana. A i ʻole, hoʻomaka ka papa inoa o nā hana hou.

Ke hoʻouka nei i kahi faila pūnaewele me nā faila kūikawā a me nā inoa papa:

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

Ke hoʻouka nei i nā papa hoʻohana i loko o kahi 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);
}

Ma hope o ka hoʻololi ʻana i ka waihona kahiko me kahi mea hou.

Ma nā laʻana ma luna, ʻo ka process_crontab function call e hōʻoia i ka loaʻa ʻana o kahi mea hoʻohana e pili ana i ka inoa faila papaʻaina (koe naʻe he superuser) a laila kāhea iā load_user. Ua heluhelu mua ka mea hope i ka faila ponoʻī i kēlā me kēia 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;
    }
}

Ma ʻaneʻi, hoʻonohonoho ʻia ka ʻano hoʻololi kaiapuni (nā laina o ke ʻano VAR=value) me ka hoʻohana ʻana i nā hana load_env / env_set, a heluhelu ʻia ka wehewehe hana (* * * * * /path/to/exec) me ka hoʻohana ʻana i ka hana load_entry.

ʻO ka mea komo i hoʻihoʻi ʻia e load_entry ʻo kā mākou hana, waiho ʻia ma ka papa inoa o nā hana. Lawe ʻia ka hana ponoʻī i ka parsing verbose o ka format manawa, akā makemake nui mākou i ka hoʻokumu ʻana i nā ʻano hoʻololi kaiapuni a me nā ʻāpana hoʻomaka hana:

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

Hoʻohana ka loop loop me ka papa inoa o nā hana i kēia manawa.

Loop Nui

Ua hana maʻalahi ka cron kumu mai ka Version 7 Unix: heluhelu hou ʻo ia i ka hoʻonohonoho i loko o kahi loop, hoʻokuʻu i nā hana o kēia minuke ma ke ʻano he superuser, a hiamoe a hiki i ka hoʻomaka ʻana o ka minuke aʻe. ʻO kēia ala maʻalahi i nā mīkini kahiko i makemake nui i nā kumuwaiwai.

Ua noi ʻia kahi mana ʻē aʻe ma SysV, kahi i hiamoe ai ka daemon a hiki i ka minuke kokoke loa i wehewehe ʻia ka hana, a i ʻole 30 mau minuke. ʻOi aku ka liʻiliʻi o nā kumuwaiwai no ka heluhelu hou ʻana i ka hoʻonohonoho ʻana a me ka nānā ʻana i nā hana ma kēia ʻano, akā hiki ke hoʻololi koke i ka papa inoa o nā hana.

Ua hoʻi hou ʻo Vixie cron i ka nānā ʻana i nā papa inoa hana i hoʻokahi minuke, ʻoi aku ka maikaʻi ma ka hopena o nā makahiki 80 ua ʻoi aku ka nui o nā kumuwaiwai ma nā mīkini Unix maʻamau:

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

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

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

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

Hoʻopili pololei ka hana cron_sleep i ka hoʻokō ʻana i nā hana, e kāhea ana i nā hana job_runqueue (heluhelu a holo i nā hana) a me do_command (holo i kēlā me kēia hana pākahi). ʻO ka hana hope e pono ke nānā pono i nā kikoʻī.

Holo i kahi hana

Hoʻokō ʻia ka hana do_command ma ke ʻano Unix maikaʻi, ʻo ia hoʻi, hana ia i kahi ʻōpala e hana i ka hana asynchronously. Ke hoʻomau nei ke kaʻina hana makua e hoʻomaka i nā hana, hoʻomākaukau ke kaʻina keiki i ke kaʻina hana:

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

Nui ka manaʻo i ka child_process: lawe ia i ka puka maʻamau a me nā kahawai hewa iā ia iho, i mea e hoʻouna ai iā ia i ka leka uila (inā ʻike ʻia ka loli kaiapuni MAILTO i ka papa hana), a, hope, kali no ka mea nui. kaʻina hana e hoʻopau ai.

Hoʻokumu ʻia ke kaʻina hana e kekahi fork:

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 ia wale nō ka cron. Ua haʻalele wau i kekahi mau kikoʻī hoihoi, no ka laʻana, ka helu ʻana i nā mea hoʻohana mamao, akā ua wehewehe wau i ka mea nui.

Ma hope o ka'ōlelo

He polokalamu maʻalahi a pono hoʻi ʻo Cron, i hana ʻia i nā kuʻuna maikaʻi loa o ka honua Unix. ʻAʻole ʻo ia e hana i kekahi mea ʻē aʻe, akā ua hana maikaʻi ʻo ia i kāna hana no nā makahiki he nui i kēia manawa. ʻO ka loaʻa ʻana o ke code no ka mana e hele mai me Ubuntu ʻaʻole i ʻoi aku ma mua o hoʻokahi hola, a ua hauʻoli wau! Manaʻo wau ua hiki iaʻu ke kaʻana like me ʻoe.

ʻAʻole au i ʻike e pili ana iā ʻoe, akā ke kaumaha nui nei au i ka ʻike ʻana i ka hoʻolālā ʻana o kēia wā, me kona ʻano o ka paʻakikī a me ka over-abstract, ʻaʻole i kūpono i ka maʻalahi no ka manawa lōʻihi.

Nui nā koho hou i ka cron: ʻae nā systemd-timers iā ʻoe e hoʻonohonoho i nā ʻōnaehana paʻakikī me nā hilinaʻi, hiki iā fcron ke hoʻoponopono maʻalahi i ka hoʻohana ʻana i nā kumuwaiwai e nā hana. Akā no'u iho, ua lawa ka crontab ma'alahi loa ia'u.

I ka pōkole, aloha Unix, hoʻohana i nā polokalamu maʻalahi a mai poina e heluhelu i ka mana no kāu paepae!

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka