Cron ni Linux: itan, lilo ati ẹrọ

Cron ni Linux: itan, lilo ati ẹrọ

Alailẹgbẹ kowe pe awọn wakati ayọ ko wo. Ni awọn akoko egan yẹn ko si awọn pirogirama tabi Unix, ṣugbọn loni awọn pirogirama mọ daju: cron yoo tọju abala akoko dipo wọn.

Awọn ohun elo laini aṣẹ jẹ ailera mejeeji ati iṣẹ ṣiṣe fun mi. sed, awk, wc, ge ati awọn eto atijọ miiran jẹ ṣiṣe nipasẹ awọn iwe afọwọkọ lori awọn olupin wa lojoojumọ. Ọpọlọpọ ninu wọn jẹ apẹrẹ bi awọn iṣẹ-ṣiṣe fun cron, oluṣeto akọkọ lati awọn ọdun 70.

Fun igba pipẹ Mo lo cron lainidi, laisi lilọ sinu awọn alaye, ṣugbọn ni ọjọ kan, nigbati Mo ba pade aṣiṣe kan nigbati mo nṣiṣẹ iwe afọwọkọ kan, Mo pinnu lati wo inu rẹ daradara. Eyi ni bii nkan yii ṣe han, lakoko kikọ Mo di faramọ pẹlu POSIX crontab, awọn aṣayan cron akọkọ ni awọn pinpin Linux olokiki ati eto ti diẹ ninu wọn.

Ṣe o nlo Linux ati ṣiṣe awọn iṣẹ-ṣiṣe cron? Ṣe o nifẹ si faaji ohun elo eto ni Unix? Lẹhinna a wa ni ọna wa!

Awọn akoonu

Oti ti eya

Ipaniyan igbakọọkan ti olumulo tabi awọn eto eto jẹ iwulo ti o han gbangba ni gbogbo awọn ọna ṣiṣe. Nitorinaa, awọn olupilẹṣẹ rii iwulo fun awọn iṣẹ ti o gba wọn laaye lati gbero aarin ati ṣiṣe awọn iṣẹ ṣiṣe ni igba pipẹ sẹhin.

Awọn ọna ṣiṣe bii Unix tọpa awọn ipilẹṣẹ wọn pada si Ẹya 7 Unix, ti o dagbasoke ni awọn ọdun 70 ti ọrundun to kọja ni Bell Labs, pẹlu nipasẹ olokiki Ken Thompson. Ẹya 7 Unix tun pẹlu cron, iṣẹ kan fun ṣiṣe awọn iṣẹ ṣiṣe superuser nigbagbogbo.

Aṣoju cron ode oni jẹ eto ti o rọrun, ṣugbọn algorithm iṣẹ ti ẹya atilẹba paapaa rọrun: iṣẹ naa ji lẹẹkan ni iṣẹju kan, ka tabili kan pẹlu awọn iṣẹ ṣiṣe lati faili kan (/etc/lib/crontab) ati ṣe fun superuser awọn iṣẹ ṣiṣe ti o yẹ ki o ti ṣe ni akoko lọwọlọwọ.

Lẹhinna, awọn ẹya ilọsiwaju ti iṣẹ ti o rọrun ati iwulo ni a pese pẹlu gbogbo awọn ọna ṣiṣe ti o dabi Unix.

Awọn apejuwe gbogbogbo ti ọna kika crontab ati awọn ipilẹ awọn ipilẹ ti iṣiṣẹ ohun elo naa wa ninu boṣewa akọkọ ti awọn ọna ṣiṣe bi Unix - POSIX - ni ọdun 1992, ati nitorinaa cron lati boṣewa de facto di boṣewa de jure.

Ni ọdun 1987, Paul Vixie, ti o ti ṣe iwadi awọn olumulo Unix nipa awọn ifẹ wọn fun cron, tu ẹda miiran ti daemon ti o ṣe atunṣe diẹ ninu awọn iṣoro ti cron ti aṣa ati ti o gbooro sii sintasi ti awọn faili tabili.

Nipa ẹya kẹta ti Vixie cron bẹrẹ lati pade awọn ibeere POSIX, ni afikun, eto naa ni iwe-aṣẹ ominira, tabi dipo ko si iwe-aṣẹ rara, ayafi fun awọn ifẹ inu README: onkọwe ko fun awọn iṣeduro, orukọ onkọwe ko le paarẹ, ati awọn eto le nikan wa ni ta paapọ pẹlu koodu orisun. Awọn ibeere wọnyi wa ni ibamu pẹlu awọn ipilẹ ti sọfitiwia ọfẹ ti o ni gbaye-gbale ni awọn ọdun wọnyẹn, nitorinaa diẹ ninu awọn ipinpinpin Linux bọtini ti o han ni ibẹrẹ 90s mu Vixie cron bi eto wọn ọkan ati pe wọn tun n dagbasoke loni.

Ni pataki, Red Hat ati SUSE ṣe agbekalẹ orita ti Vixie cron - cronie, ati Debian ati Ubuntu lo ẹda atilẹba ti Vixie cron pẹlu ọpọlọpọ awọn abulẹ.

Jẹ ki a kọkọ faramọ pẹlu crontab olumulo olumulo ti a ṣalaye ninu POSIX, lẹhin eyi a yoo wo awọn amugbooro sintasi ti a pese ni Vixie cron ati lilo awọn iyatọ ti Vixie cron ni awọn pinpin olokiki Linux. Ati nikẹhin, ṣẹẹri lori akara oyinbo naa jẹ itupalẹ ti ẹrọ cron daemon.

POSIX crontab

Ti cron atilẹba ba ṣiṣẹ nigbagbogbo fun superuser, awọn oluṣeto ode oni nigbagbogbo ṣe pẹlu awọn iṣẹ ṣiṣe ti awọn olumulo lasan, eyiti o ni aabo diẹ sii ati irọrun.

Awọn Crons ni a pese bi eto awọn eto meji: cron daemon ti nṣiṣẹ nigbagbogbo ati ohun elo crontab ti o wa fun awọn olumulo. Ikẹhin gba ọ laaye lati ṣatunkọ awọn tabili iṣẹ-ṣiṣe kan pato si olumulo kọọkan ninu eto naa, lakoko ti daemon ṣe ifilọlẹ awọn iṣẹ ṣiṣe lati ọdọ olumulo ati awọn tabili eto.

В boṣewa POSIX ihuwasi ti daemon ko ṣe apejuwe ni eyikeyi ọna ati pe eto olumulo nikan ni a ṣe agbekalẹ crontab. Aye awọn ọna ṣiṣe fun ifilọlẹ awọn iṣẹ ṣiṣe olumulo jẹ, dajudaju, tumọ, ṣugbọn kii ṣe apejuwe ni awọn alaye.

Nipa pipe ohun elo crontab, o le ṣe awọn nkan mẹrin: satunkọ tabili iṣẹ-ṣiṣe olumulo ni olootu, gbe tabili lati faili kan, ṣafihan tabili iṣẹ ṣiṣe lọwọlọwọ, ati ko tabili iṣẹ-ṣiṣe kuro. Awọn apẹẹrẹ ti bii ohun elo crontab ṣe n ṣiṣẹ:

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

Nigbati o ba n pe crontab -e olootu pato ninu awọn boṣewa ayika oniyipada yoo ṣee lo EDITOR.

Awọn iṣẹ-ṣiṣe funrararẹ ni a ṣe apejuwe ni ọna kika atẹle:

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

Awọn aaye marun akọkọ ti awọn igbasilẹ: iṣẹju [1..60], awọn wakati [0..23], awọn ọjọ ti oṣu [1..31], awọn oṣu [1..12], awọn ọjọ ọsẹ [0. .6], nibiti 0 wa ni Ọjọ Ọṣẹ. Ikẹhin, kẹfa, aaye jẹ laini kan ti yoo ṣe nipasẹ onitumọ aṣẹ boṣewa.

Ni awọn aaye marun akọkọ, awọn iye le ṣe atokọ niya nipasẹ aami idẹsẹ:

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

Tabi pẹlu arosọ:

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

Wiwọle olumulo si ṣiṣe eto iṣẹ-ṣiṣe jẹ ofin ni POSIX nipasẹ awọn faili cron.allow ati cron.deny, eyiti o ṣe atokọ awọn olumulo pẹlu iraye si crontab ati awọn olumulo laisi iwọle si eto naa, lẹsẹsẹ. Iwọnwọn ko ṣe ilana ipo ti awọn faili wọnyi ni eyikeyi ọna.

Gẹgẹbi boṣewa, o kere ju awọn oniyipada ayika mẹrin gbọdọ kọja si awọn eto ifilọlẹ:

  1. ILE - ilana ile olumulo.
  2. LOGNAME — olumulo wiwọle.
  3. PATH jẹ ọna ti o le wa awọn ohun elo eto boṣewa.
  4. SHELL - ọna si olutumọ aṣẹ ti a lo.

Ni pataki, POSIX ko sọ nkankan nipa ibiti awọn iye fun awọn oniyipada wọnyi ti wa.

Ti o dara ju eniti o - Vixie cron 3.0pl1

Baba ti o wọpọ ti awọn iyatọ cron olokiki jẹ Vixie cron 3.0pl1, ti a ṣe sinu atokọ ifiweranṣẹ comp.sources.unix ni ọdun 1992. A yoo ṣe akiyesi awọn ẹya akọkọ ti ẹya yii ni awọn alaye diẹ sii.

Vixie cron wa ni awọn eto meji (cron ati crontab). Gẹgẹbi igbagbogbo, daemon jẹ iduro fun kika ati ṣiṣe awọn iṣẹ ṣiṣe lati tabili iṣẹ ṣiṣe eto ati awọn tabili iṣẹ ṣiṣe olumulo kọọkan, ati pe ohun elo crontab jẹ iduro fun ṣiṣatunṣe awọn tabili olumulo.

Tabili iṣẹ ati awọn faili iṣeto ni

Tabili iṣẹ-ṣiṣe superuser wa ni /etc/crontab. Sintasi ti tabili eto ni ibamu si sintasi ti Vixie cron, ayafi ti iwe kẹfa ninu rẹ tọkasi orukọ olumulo labẹ ẹniti iṣẹ-ṣiṣe ti ṣe ifilọlẹ:

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

Awọn tabili iṣẹ ṣiṣe olumulo deede wa ni /var/cron/tabs/orukọ olumulo ati lo sintasi kanna. Nigbati o ba ṣiṣẹ ohun elo crontab bi olumulo, iwọnyi ni awọn faili ti o ṣatunkọ.

Awọn atokọ ti awọn olumulo pẹlu iraye si crontab ni iṣakoso ni /var/cron/aaye ati /var/cron/ki awọn faili, nibiti o kan nilo lati tẹ orukọ olumulo sii ni laini lọtọ.

Sintasi ti o gbooro sii

Ti a ṣe afiwe si POSIX crontab, ojutu Paul Vixey ni ọpọlọpọ awọn iyipada ti o wulo pupọ si sintasi ti awọn tabili iṣẹ ṣiṣe.

Sintasi tabili tuntun ti wa: fun apẹẹrẹ, o le pato awọn ọjọ ti ọsẹ tabi awọn oṣu nipasẹ orukọ (Ọjọ, Ọjọbọ, ati bẹbẹ lọ):

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

O le pato igbesẹ nipasẹ eyiti awọn iṣẹ ṣiṣe ti ṣe ifilọlẹ:

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

Awọn igbesẹ ati awọn aaye arin le jẹ adalu:

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

Awọn ọna yiyan ogbon inu si sintasi deede jẹ atilẹyin (atunbere, ọdun, ọdọọdun, oṣooṣu, osẹ-ọsẹ, ojoojumọ, ọganjọ, wakati):

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

Ayika ipaniyan iṣẹ-ṣiṣe

Vixie cron gba ọ laaye lati yi agbegbe ti awọn ohun elo nṣiṣẹ pada.

Awọn oniyipada ayika USER, LOGNAME ati HOME kii ṣe pese nikan nipasẹ daemon, ṣugbọn a gba lati faili kan passwd. A ṣeto oniyipada PATH si "/ usr/bin:/bin" ati pe oniyipada SHELL ti ṣeto si "/ bin/sh". Awọn iye ti gbogbo awọn oniyipada ayafi LOGNAME le yipada ni awọn tabili olumulo.

Diẹ ninu awọn oniyipada ayika (paapaa SHELL ati ILE) jẹ lilo nipasẹ cron funrararẹ lati ṣiṣẹ iṣẹ naa. Eyi ni kini lilo bash dipo sh boṣewa lati ṣiṣẹ awọn iṣẹ ṣiṣe aṣa le dabi:

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

Nigbamii, gbogbo awọn oniyipada ayika ti a ṣalaye ninu tabili (lo nipasẹ cron tabi ti o nilo nipasẹ ilana) yoo kọja si iṣẹ ṣiṣe.

Lati ṣatunkọ awọn faili, crontab nlo olootu ti a sọ pato ninu VISUAL tabi oniyipada ayika EDITOR. Ti agbegbe nibiti a ti ṣiṣẹ crontab ko ni asọye awọn oniyipada wọnyi, lẹhinna “/ usr/ ucb/vi” ni a lo (ucb jasi University of California, Berkeley).

cron lori Debian ati Ubuntu

Awọn olupilẹṣẹ ti Debian ati awọn ipinpinpin itọsẹ ti tu silẹ gíga títúnṣe version Vixie cron version 3.0pl1. Ko si awọn iyatọ ninu sintasi ti awọn faili tabili; Ẹya Tuntun ti o tobi julọ: Atilẹyin syslog, SELinux и Pam.

Ti ṣe akiyesi diẹ, ṣugbọn awọn iyipada ojulowo pẹlu ipo awọn faili iṣeto ati awọn tabili iṣẹ-ṣiṣe.

Awọn tabili olumulo ni Debian wa ninu itọsọna / var/spool/cron/crontabs, tabili eto ṣi wa nibẹ - ni /etc/crontab. Awọn tabili iṣẹ-ṣiṣe pato-pato Debian ti wa ni gbe sinu /etc/cron.d, lati ibiti cron daemon ti ka wọn laifọwọyi. Iṣakoso wiwọle olumulo jẹ iṣakoso nipasẹ awọn faili /etc/cron.allow ati /etc/cron.deny.

Ikarahun aiyipada ṣi / bin/sh, eyiti o wa ninu Debian jẹ ikarahun ifaramọ POSIX kekere kan daaṣi, se igbekale lai kika eyikeyi iṣeto ni (ni ti kii-ibaraẹnisọrọ mode).

Cron funrararẹ ni awọn ẹya tuntun ti Debian ti ṣe ifilọlẹ nipasẹ systemd, ati iṣeto ifilọlẹ le jẹ wiwo ni /lib/systemd/system/cron.service. Ko si ohun pataki ni iṣeto ni iṣẹ;

cronie lori RedHat, Fedora ati CentOS

àgbèrè - orita ti ẹya Vixie cron 4.1. Gẹgẹbi Debian, sintasi ko yipada, ṣugbọn atilẹyin fun PAM ati SELinux, ṣiṣẹ ni iṣupọ kan, awọn faili ipasẹ nipa lilo inotify ati awọn ẹya miiran ti ṣafikun.

Iṣeto aifọwọyi wa ni awọn aaye deede: tabili eto wa ni /etc/crontab, awọn idii fi awọn tabili wọn sinu /etc/cron.d, awọn tabili olumulo lọ sinu /var/spool/cron/crontabs.

Daemon n ṣiṣẹ labẹ iṣakoso eto, iṣeto iṣẹ jẹ /lib/systemd/system/crond.service.

Lori awọn ipinpinpin Red Hat, / bin/sh ti lo nipasẹ aiyipada ni ibẹrẹ, eyiti o jẹ bash boṣewa. O yẹ ki o ṣe akiyesi pe nigbati o nṣiṣẹ awọn iṣẹ cron nipasẹ / bin / sh, ikarahun bash bẹrẹ ni ipo ifaramọ POSIX ati pe ko ka eyikeyi iṣeto ni afikun, nṣiṣẹ ni ipo ti kii ṣe ibaraẹnisọrọ.

cronie ni SLES ati openSUSE

Awọn pinpin German SLES ati itọsẹ openSUSE lo cronie kanna. Daemon nibi tun ṣe ifilọlẹ labẹ systemd, iṣeto iṣẹ naa wa ni /usr/lib/systemd/system/cron.service. Iṣeto ni: /etc/crontab, /etc/cron.d, /var/spool/cron/tabs. / bin/sh jẹ bash kanna ti nṣiṣẹ ni POSIX-ibaramu ipo ti kii ṣe ibaraẹnisọrọ.

Vixie cron ẹrọ

Awọn ọmọ ode oni ti cron ko ti yipada ni ipilẹṣẹ ni akawe si Vixie cron, ṣugbọn tun gba awọn ẹya tuntun ti ko nilo lati loye awọn ipilẹ ti eto naa. Pupọ ninu awọn amugbooro wọnyi jẹ apẹrẹ ti ko dara ati daru koodu naa. Awọn koodu orisun cron atilẹba nipasẹ Paul Vixey jẹ igbadun lati ka.

Nitorinaa, Mo pinnu lati ṣe itupalẹ ẹrọ cron nipa lilo apẹẹrẹ ti eto cron ti o wọpọ si awọn ẹka mejeeji ti idagbasoke - Vixie cron 3.0pl1. Emi yoo jẹ ki awọn apẹẹrẹ rọrun nipa yiyọ awọn ifdefs ti o diju kika ati yiyọ awọn alaye kekere silẹ.

Iṣẹ ti ẹmi èṣu le pin si awọn ipele pupọ:

  1. Ipilẹṣẹ eto.
  2. Gbigba ati mimu imudojuiwọn akojọ awọn iṣẹ ṣiṣe lati ṣiṣe.
  3. Akọkọ cron lupu nṣiṣẹ.
  4. Bẹrẹ iṣẹ-ṣiṣe kan.

Jẹ ki a wo wọn lẹsẹsẹ.

Ibẹrẹ

Nigbati o ba bẹrẹ, lẹhin ti ṣayẹwo awọn ariyanjiyan ilana, cron fi sori ẹrọ SIGCHLD ati awọn olutọju ifihan agbara SIGHUP. Eyi akọkọ ṣe titẹsi log kan nipa ifopinsi ilana ọmọ, ekeji tilekun oluṣapejuwe faili ti faili log:

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

Cron daemon nigbagbogbo nṣiṣẹ nikan lori eto, nikan bi superuser ati lati inu itọsọna cron akọkọ. Awọn ipe wọnyi ṣẹda faili titiipa pẹlu PID ti ilana daemon, rii daju pe olumulo naa jẹ deede ki o yi itọsọna lọwọlọwọ pada si akọkọ:

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

Ona aiyipada ti ṣeto, eyiti yoo ṣee lo nigbati awọn ilana bẹrẹ:

setenv("PATH", _PATH_DEFPATH, 1);

Lẹhinna ilana naa jẹ “daemonized”: o ṣẹda ẹda ọmọ ti ilana naa nipa pipe orita ati igba tuntun ninu ilana ọmọ (pipe setsid). Ilana obi ko nilo mọ, o si jade:

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

Ifopinsi ilana obi ṣe idasilẹ titiipa lori faili titiipa. Ni afikun, o nilo lati ṣe imudojuiwọn PID ninu faili si ọmọ naa. Lẹhin eyi, aaye data iṣẹ-ṣiṣe ti kun ni:

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

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

Lẹhinna cron tẹsiwaju si iwọn iṣẹ akọkọ. Ṣugbọn ṣaaju iyẹn, o tọ lati wo ni ikojọpọ atokọ iṣẹ-ṣiṣe.

Gbigba ati mimu imudojuiwọn akojọ iṣẹ-ṣiṣe

Iṣẹ load_database jẹ iduro fun ikojọpọ atokọ awọn iṣẹ ṣiṣe. O ṣayẹwo crontab eto akọkọ ati itọsọna pẹlu awọn faili olumulo. Ti awọn faili ati itọsọna ko ba yipada, atokọ iṣẹ-ṣiṣe ko tun ka. Bibẹẹkọ, atokọ tuntun ti awọn iṣẹ-ṣiṣe bẹrẹ lati dagba.

Ikojọpọ faili eto pẹlu faili pataki ati awọn orukọ tabili:

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

Nkojọpọ awọn tabili olumulo ni lupu kan:

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

Lẹhin eyi ti atijọ database ti wa ni rọpo pẹlu titun kan.

Ni awọn apẹẹrẹ ti o wa loke, ipe iṣẹ_crontab jẹri pe olumulo kan ti o baamu orukọ faili tabili wa (ayafi ti o jẹ superuser) ati lẹhinna pe load_user. Ikẹhin ti ka faili funrararẹ laini nipasẹ laini:

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

Nibi, boya a ti ṣeto oniyipada ayika (awọn ila ti fọọmu VAR = iye) nipa lilo awọn iṣẹ load_env / env_set, tabi apejuwe iṣẹ-ṣiṣe ti wa ni ka (* * * * * / ipa-ọna / si / exec) nipa lilo iṣẹ load_entry.

Ẹya titẹsi ti load_entry pada jẹ iṣẹ-ṣiṣe wa, eyiti a gbe sinu atokọ gbogbogbo ti awọn iṣẹ ṣiṣe. Iṣẹ naa funrararẹ ṣe itupalẹ ọrọ-ọrọ ti ọna kika akoko, ṣugbọn a nifẹ diẹ si dida awọn oniyipada ayika ati awọn aye ifilọlẹ iṣẹ-ṣiṣe:

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

Lupu akọkọ n ṣiṣẹ pẹlu atokọ lọwọlọwọ ti awọn iṣẹ ṣiṣe.

Yipo akọkọ

Cron atilẹba lati Ẹya 7 Unix ṣiṣẹ ni irọrun: o tun ka iṣeto ni lupu kan, ṣe ifilọlẹ awọn iṣẹ ṣiṣe ti iṣẹju lọwọlọwọ bi superuser, o sùn titi di ibẹrẹ iṣẹju atẹle. Ọna ti o rọrun yii lori awọn ẹrọ agbalagba nilo ọpọlọpọ awọn orisun.

A dabaa ẹya yiyan ni SysV, ninu eyiti daemon lọ sun boya titi di iṣẹju ti o sunmọ julọ eyiti a ti ṣalaye iṣẹ naa, tabi fun ọgbọn iṣẹju. Diẹ ninu awọn orisun ni a jẹ fun atunto atunto ati ṣayẹwo awọn iṣẹ ṣiṣe ni ipo yii, ṣugbọn mimu imudojuiwọn atokọ ti awọn iṣẹ ṣiṣe ni iyara di airọrun.

Vixie cron pada si ṣiṣayẹwo awọn atokọ iṣẹ-ṣiṣe lẹẹkan ni iṣẹju kan, ni oriire ni opin awọn ọdun 80 awọn orisun diẹ sii ni pataki lori awọn ẹrọ Unix boṣewa:

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

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

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

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

Iṣẹ cron_sleep jẹ taara taara ni ṣiṣe awọn iṣẹ ṣiṣe, pipe job_runqueue (ṣe iṣiro ati ṣiṣe awọn iṣẹ ṣiṣe) ati ṣiṣe_command (ṣiṣe iṣẹ-ṣiṣe kọọkan). Awọn ti o kẹhin iṣẹ jẹ tọ ayẹwo ni diẹ apejuwe awọn.

Ṣiṣe iṣẹ-ṣiṣe kan

Iṣẹ ṣiṣe do_command jẹ ṣiṣe ni aṣa Unix to dara, iyẹn ni, o ṣe orita lati ṣe iṣẹ-ṣiṣe ni asynchronously. Ilana obi tẹsiwaju lati ṣe ifilọlẹ awọn iṣẹ ṣiṣe, ilana ọmọ n mura ilana iṣẹ ṣiṣe:

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

Ọpọ ọgbọn lo wa ninu child_process: o gba abajade boṣewa ati awọn ṣiṣan aṣiṣe lori ararẹ, lati le firanṣẹ si meeli (ti o ba jẹ iyatọ agbegbe MAILTO ni tabili iṣẹ), ati, nikẹhin, duro de akọkọ. ilana ti iṣẹ-ṣiṣe lati pari.

Ilana iṣẹ-ṣiṣe jẹ akoso nipasẹ orita miiran:

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

Iyẹn ni ipilẹ gbogbo cron jẹ. Mo fi diẹ ninu awọn alaye ti o nifẹ si, fun apẹẹrẹ, ṣiṣe iṣiro fun awọn olumulo latọna jijin, ṣugbọn Mo ṣe ilana ohun akọkọ.

Lẹhin Ọrọ

Cron jẹ eto iyalẹnu rọrun ati iwulo, ti a ṣe ni awọn aṣa ti o dara julọ ti agbaye Unix. Ko ṣe ohunkohun afikun, ṣugbọn o ti n ṣe iṣẹ rẹ ni iyalẹnu fun ọpọlọpọ awọn ewadun ni bayi. Ko gba diẹ sii ju wakati kan lọ lati ni oye pẹlu koodu fun ẹya ti o wa pẹlu Ubuntu, ati pe Mo ni igbadun pupọ! Mo nireti pe MO ni anfani lati pin pẹlu rẹ.

Emi ko mọ nipa rẹ, ṣugbọn Mo ni ibanujẹ diẹ lati mọ pe siseto ode oni, pẹlu itara rẹ lati ni idiju pupọ ati abọtẹlẹ, ko ni itara si iru ayedero bẹ fun igba pipẹ.

Ọpọlọpọ awọn ọna yiyan ode oni wa si cron: awọn akoko eto eto gba ọ laaye lati ṣeto awọn eto eka pẹlu awọn igbẹkẹle, fcron ngbanilaaye lati ni irọrun diẹ sii ni irọrun ilana agbara awọn orisun nipasẹ awọn iṣẹ ṣiṣe. Ṣugbọn tikalararẹ, crontab ti o rọrun julọ nigbagbogbo to fun mi.

Ni kukuru, nifẹ Unix, lo awọn eto ti o rọrun ati maṣe gbagbe lati ka mana fun pẹpẹ rẹ!

orisun: www.habr.com

Fi ọrọìwòye kun