Cron amin'ny Linux: tantara, fampiasana ary fitaovana

Cron amin'ny Linux: tantara, fampiasana ary fitaovana

Nanoratra ny mahazatra fa tsy mijery ny ora mahafaly. Tamin'izany fotoana izany dia tsy nisy mpandrindra na Unix, fa amin'izao fotoana izao dia fantatr'ireo mpandrindra programa: ny cron dia hanara-maso ny fotoana fa tsy azy ireo.

Sady fahalemena no adidy ho ahy ny fampandehanan-baiko. sed, awk, wc, cut ary ny programa taloha hafa dia tantanan'ny script ao amin'ny lohamilinay isan'andro. Maro amin'izy ireo no natao ho asa ho an'ny cron, fandaharam-potoana tany am-boalohany tamin'ny taona 70.

Nandritra ny fotoana ela dia nampiasa cron aho, tsy niditra tamin'ny antsipiriany, fa indray andro, rehefa nahita hadisoana aho tamin'ny fampandehanana script, dia nanapa-kevitra ny hijery azy io aho. Toy izao no nisehoan'ity lahatsoratra ity, rehefa nanoratra azy aho dia nanjary nahafantatra ny POSIX crontab, ny safidy cron lehibe amin'ny fizarana Linux malaza sy ny firafitry ny sasany amin'izy ireo.

Mampiasa Linux ve ianao ary manao asa cron? Liana amin'ny rafitra fampiharana rafitra ao amin'ny Unix ve ianao? Dia handeha izahay!

afa-po

Ny niandohan'ny karazana

Ny famonoana tsindraindray ny programa mpampiasa na rafitra dia tena ilaina amin'ny rafitra miasa rehetra. Noho izany, fantatry ny programmer ny filana serivisy ahafahan'izy ireo manomana sy manatanteraka asa efa hatry ny ela.

Ny rafitra fiasa mitovy amin'ny Unix dia mamakivaky ny fiaviany any amin'ny Version 7 Unix, novolavolaina tamin'ny taona 70 tamin'ny taonjato farany tao amin'ny Bell Labs, anisan'izany ny Ken Thompson malaza. Ny version 7 Unix koa dia nahitana cron, serivisy ho an'ny asa superuser tsy tapaka.

Ny cron maoderina mahazatra dia programa tsotra, fa ny algorithm miasa amin'ny dikan-teny tany am-boalohany dia mbola tsotra kokoa: nifoha indray mandeha isa-minitra ny serivisy, namaky latabatra misy asa avy amin'ny rakitra tokana (/etc/lib/crontab) ary natao ho an'ny superuser ireo asa tokony ho natao amin'izao fotoana izao.

Taorian'izay dia nomena ny dikan-teny hatsaraina amin'ny serivisy tsotra sy mahasoa miaraka amin'ireo rafitra fiasa mitovy amin'ny Unix rehetra.

Ny famaritana ankapobeny momba ny endrika crontab sy ny fitsipika fototra amin'ny fampandehanana ny fitaovana dia nampidirina tao amin'ny fenitra fototra amin'ny rafitra fiasa mitovy amin'ny Unix - POSIX - tamin'ny taona 1992, ary noho izany dia nanjary fenitra de jure ny cron avy amin'ny fenitra de facto.

Tamin'ny 1987, Paul Vixie, rehefa nanadihady ireo mpampiasa Unix momba ny fanirian'izy ireo ho an'ny cron, dia namoaka dikan-teny iray hafa amin'ny daemon izay nanitsy ny sasany amin'ireo olan'ny cron nentim-paharazana ary nanitatra ny syntax ny rakitra latabatra.

Amin'ny alàlan'ny dikan-teny fahatelo an'ny Vixie cron dia nanomboka nahafeno ny fepetra POSIX, ankoatra izany, ny programa dia nanana fahazoan-dàlana malalaka, na ny marimarina kokoa dia tsy nisy fahazoan-dàlana mihitsy, afa-tsy ny faniriana ao amin'ny README: tsy manome antoka ny mpanoratra, ny anaran'ny mpanoratra. tsy azo fafana, ary ny programa dia azo amidy miaraka amin'ny kaody loharano ihany. Ireo fepetra ireo dia nifanaraka tamin'ny fitsipiky ny rindrambaiko maimaim-poana izay nalaza tamin'izany taona izany, ka ny sasany amin'ireo fizarana Linux lehibe izay niseho tamin'ny fiandohan'ny taona 90 dia naka ny Vixie cron ho rafitra iray ary mbola mamolavola azy io ankehitriny.

Indrindra indrindra, ny Red Hat sy ny SUSE dia mamolavola ny Vixie cron - cronie, ary i Debian sy Ubuntu dia mampiasa ny andiany voalohany amin'ny Vixie cron misy patch maro.

Andao aloha hifankahalala amin'ny crontab utility mpampiasa voalaza ao amin'ny POSIX, aorian'izay dia hojerentsika ny fanitarana syntax omena ao amin'ny Vixie cron sy ny fampiasana ny fiovaovan'ny Vixie cron amin'ny fizarana Linux malaza. Ary farany, ny serizy amin'ny mofomamy dia ny famakafakana ny fitaovana cron daemon.

POSIX crontab

Raha niasa ho an'ny superuser foana ny cron tany am-boalohany, ny mpandrindra maoderina matetika dia miatrika ny asan'ny mpampiasa tsotra, izay azo antoka sy mety kokoa.

Ny Crons dia omena amin'ny alàlan'ny programa roa: ny daemon cron mandeha tsy tapaka sy ny fitaovana crontab azon'ny mpampiasa. Ity farany dia ahafahanao manitsy ny latabatra asa manokana ho an'ny mpampiasa tsirairay ao amin'ny rafitra, raha ny daemon kosa dia mamoaka asa avy amin'ny latabatra mpampiasa sy rafitra.

В POSIX standard ny fitondran-tenan'ny daemon dia tsy voalaza amin'ny fomba rehetra ary ny programa mpampiasa ihany no voarindra crontab. Ny fisian'ny mekanika amin'ny fandefasana ny asan'ny mpampiasa dia mazava ho azy fa voalaza fa tsy voalaza amin'ny antsipiriany.

Amin'ny fiantsoana ny fampiasa crontab dia afaka manao zavatra efatra ianao: manitsy ny latabatra fiasan'ny mpampiasa ao amin'ny tonian-dahatsoratra, mametaka ny latabatra avy amin'ny rakitra iray, asehoy ny latabatra asa amin'izao fotoana izao, ary esory ny latabatra asa. Ohatra amin'ny fomba fiasan'ny fitaovana crontab:

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

Rehefa antsoina crontab -e ny tonian-dahatsoratra voafaritra ao amin'ny fari-piainan'ny tontolo iainana mahazatra no hampiasaina EDITOR.

Ny asa dia voafaritra amin'ny endrika manaraka:

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

Ny saha dimy voalohany amin'ny firaketana: minitra [1..60], ora [0..23], andro amin'ny volana [1..31], volana [1..12], andro amin'ny herinandro [0. .6], izay 0 ny alahady. Ny saha farany, fahenina, dia andalana izay hotanterahin'ny mpandika baiko mahazatra.

Ao amin'ny sehatra dimy voalohany, ny soatoavina dia azo zaraina amin'ny faingo:

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

Na misy tsipika:

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

Ny fidiran'ny mpampiasa amin'ny fandaharam-potoanan'ny asa dia fehezin'ny rakitra cron.allow sy cron.deny ao amin'ny POSIX, izay mitanisa ireo mpampiasa manana fidirana amin'ny crontab sy ireo mpampiasa tsy mahazo miditra amin'ny programa. Ny fenitra dia tsy mifehy ny toerana misy ireo rakitra ireo amin'ny fomba rehetra.

Araka ny fenitra, farafahakeliny fari-piainana efatra no tsy maintsy ampitaina amin'ny programa natomboka:

  1. HOME - lahatahiry an-tranon'ny mpampiasa.
  2. LOGNAME — mpampiasa fidirana.
  3. PATH no lalana ahitanao ireo fitaovana rafitra manara-penitra.
  4. SHELL - lalana mankany amin'ny mpandika baiko ampiasaina.

Marihina fa ny POSIX dia tsy milaza na inona na inona momba ny toerana niavian'ireo sanda ireo.

Mpivarotra tsara indrindra - Vixie cron 3.0pl1

Ny razamben'ny karazana cron malaza dia Vixie cron 3.0pl1, nampidirina tao amin'ny lisitry ny mailaka comp.sources.unix tamin'ny 1992. Hodinihintsika amin'ny antsipiriany bebe kokoa ny endri-javatra lehibe amin'ity dikan-teny ity.

Vixie cron dia tonga amin'ny programa roa (cron sy crontab). Toy ny mahazatra, ny daemon dia tompon'andraikitra amin'ny famakiana sy fampandehanana asa avy amin'ny latabatra fiasan'ny rafitra sy ny latabatra fiasan'ny mpampiasa tsirairay, ary ny fampiasa crontab dia tompon'andraikitra amin'ny fanovana ny latabatra mpampiasa.

Tabilao asa sy fichier configuration

Ny latabatra asa superuser dia hita ao amin'ny /etc/crontab. Ny syntax amin'ny latabatra rafitra dia mifanandrify amin'ny syntax an'ny Vixie cron, afa-tsy ny tsanganana fahenina ao anatiny dia manondro ny anaran'ny mpampiasa izay nanombohana ny asa:

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

Ny tabilaon'ny mpampiasa mahazatra dia hita ao amin'ny /var/cron/tabs/username ary mampiasa syntax mitovy. Rehefa mampiasa ny fampiasa crontab ianao amin'ny maha mpampiasa anao dia ireto no rakitra ovaina.

Ny lisitr'ireo mpampiasa manana fidirana amin'ny crontab dia tantanina ao amin'ny rakitra /var/cron/allow sy /var/cron/deny, izay tsy maintsy ampidirinao amin'ny tsipika misaraka fotsiny ny anaran'ny mpampiasa.

Syntax miitatra

Raha ampitahaina amin'ny POSIX crontab, ny vahaolana an'i Paul Vixey dia misy fanovana tena ilaina amin'ny syntax ny latabatra fiasan'ny utility.

Misy syntax tabilao vaovao azo ampiasaina: ohatra, azonao atao ny mamaritra ny andro amin'ny herinandro na volana amin'ny anarana (Alatsinainy, Talata, sns):

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

Azonao atao ny mamaritra ny dingana hanombohana ny asa:

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

Afaka mifangaro ny dingana sy ny elanelana:

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

Ny safidy intuitive amin'ny syntax mahazatra dia tohanana (reboot, isan-taona, isan-taona, isam-bolana, isan-kerinandro, isan'andro, mamatonalina, ora):

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

Tontolo famonoana asa

Vixie cron dia ahafahanao manova ny tontolon'ny fampiharana mihazakazaka.

Ny fari-piainan'ny tontolo iainana USER, LOGNAME ary HOME dia tsy omen'ny daemon fotsiny, fa nalaina tamina rakitra iray. passwd. Ny fari-pahaizan'ny PATH dia napetraka amin'ny "/ usr / bin: / bin" ary ny fari-piadidiana SHELL dia napetraka amin'ny "/ bin / sh". Ny sandan'ny variable rehetra afa-tsy LOGNAME dia azo ovaina amin'ny tabilao mpampiasa.

Ny fari-piainan'ny tontolo iainana sasany (indrindra indrindra SHELL sy HOME) dia ampiasain'ny cron mihitsy mba hampandehanana ilay asa. Ity ny mety ho endriky ny fampiasana bash fa tsy sh mahazatra mba hampandehanana asa mahazatra:

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

Amin'ny farany, ny fari-piainan'ny tontolo iainana rehetra voafaritra ao amin'ny latabatra (ampiasain'ny cron na ilaina amin'ny dingana) dia halefa amin'ny asa mihazakazaka.

Raha hanova ny rakitra, crontab dia mampiasa ny tonian-dahatsoratra voafaritra ao amin'ny fari-piainana VISUAL na EDITOR. Raha tsy manana ireo fari-pahalalana ireo ny tontolo iainan'ny crontab, dia "/usr/ucb/vi" no ampiasaina (ucb angamba ny University of California, Berkeley).

cron amin'ny Debian sy Ubuntu

Navoaka ny mpamorona ny Debian sy ny fizarana derivative dikan-teny novaina be Vixie cron version 3.0pl1. Tsy misy fahasamihafana eo amin'ny syntax ny rakitra latabatra ho an'ny mpampiasa dia mitovy amin'ny Vixie cron. Endri-javatra vaovao lehibe indrindra: Fanohanana syslog, SELinux и Pam.

Tsy dia tsikaritra loatra, fa ny fiovana azo tsapain-tanana dia ahitana ny toerana misy ny rakitra fikirakirana sy ny latabatra asa.

Ny tabilao mpampiasa ao amin'ny Debian dia hita ao amin'ny lahatahiry /var/spool/cron/crontabs, mbola eo ny latabatra rafitra - ao amin'ny /etc/crontab. Apetraka ao amin'ny /etc/cron.d ny latabatra asa manokana momba ny fonosana Debian, izay amakian'ny daemon cron ho azy ireo. Ny fifehezana ny fidirana amin'ny mpampiasa dia fehezin'ny rakitra /etc/cron.allow sy /etc/cron.deny.

Ny shell default dia mbola / bin / sh, izay ao amin'ny Debian dia akorandriaka kely mifanaraka amin'ny POSIX dash, natomboka tsy namaky tefy (amin'ny fomba tsy misy interactive).

Ny Cron mihitsy amin'ny dikan-teny farany an'ny Debian dia natomboka tamin'ny alàlan'ny systemd, ary azo jerena ao amin'ny /lib/systemd/system/cron.service. Tsy misy na inona na inona manokana amin'ny fandrindrana serivisy azo atao amin'ny alàlan'ny fari-piainan'ny tontolo iainana nambara mivantana ao amin'ny crontab ny mpampiasa tsirairay.

cronie amin'ny RedHat, Fedora ary CentOS

crony - Fork an'ny Vixie cron version 4.1. Tahaka ny ao amin'ny Debian, tsy niova ny syntax, fa ny fanohanana ny PAM sy SELinux, miasa amin'ny cluster, ny fanaraha-maso ny rakitra amin'ny fampiasana inotify ary ny endri-javatra hafa dia nampiana.

Ny fanamafisam-peo default dia any amin'ny toerana mahazatra: ao amin'ny /etc/crontab ny latabatra rafitra, ny fonosana dia mametraka ny latabatra ao amin'ny /etc/cron.d, miditra ny latabatra mpampiasa /var/spool/cron/crontabs.

Ny daemon dia mandeha eo ambany fanaraha-mason'ny systemd, ny fandrindrana ny serivisy dia /lib/systemd/system/crond.service.

Amin'ny fizarana Red Hat, / bin / sh dia ampiasaina amin'ny alàlan'ny fanombohana, izay ny bash mahazatra. Marihina fa rehefa manao asa cron amin'ny alàlan'ny /bin/sh, dia manomboka amin'ny fomba mifanaraka amin'ny POSIX ny akorandriaka bash ary tsy mamaky teny fanampiny, mandeha amin'ny fomba tsy misy interactive.

cronie ao amin'ny SLES sy openSUSE

Ny fizarana alemana SLES sy ny derivative openSUSE dia mampiasa cronie mitovy. Ny daemon eto koa dia natomboka teo ambanin'ny systemd, ny fametrahana serivisy dia hita ao amin'ny /usr/lib/systemd/system/cron.service. Configuration: /etc/crontab, /etc/cron.d, /var/spool/cron/tabs. /bin/sh dia ny bash mitovy amin'ny POSIX-compliant non-interactive mode.

Vixie cron fitaovana

Ny taranaky ny cron maoderina dia tsy niova tanteraka raha oharina amin'ny Vixie cron, fa mbola nahazo endri-javatra vaovao izay tsy takiana amin'ny fahazoana ny fitsipiky ny programa. Maro amin'ireo fanitarana ireo no tsy voavolavola ary manakorontana ny kaody. Ny kaody loharano cron voalohany nataon'i Paul Vixey dia mahafinaritra ny mamaky.

Noho izany dia nanapa-kevitra ny hamakafaka ny fitaovana cron aho amin'ny fampiasana ny ohatra momba ny programa cron mahazatra amin'ny sampana fampandrosoana roa - Vixie cron 3.0pl1. Hanatsotra ny ohatra aho amin'ny alàlan'ny fanesorana ifdefs izay manasarotra ny famakiana sy manala ny antsipiriany madinika.

Ny asan'ny demonia dia azo zaraina ho dingana maromaro:

  1. Fanombohana fandaharana.
  2. Manangona sy manavao ny lisitry ny asa tokony hatao.
  3. Main cron loop mihazakazaka.
  4. Manomboka asa.

Andeha hojerentsika ny filaharany.

Fanombohana

Rehefa natomboka, rehefa avy nanamarina ny tohan-kevitry ny dingana, cron dia mametraka ny mpandrindra famantarana SIGCHLD sy SIGHUP. Ny voalohany dia manao firaketana an-tsoratra momba ny fampitsaharana ny fizotry ny zaza, ny faharoa dia manidy ny famaritana ny rakitra momba ny rakitra:

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

Ny daemon cron dia mandeha irery foana amin'ny rafitra, amin'ny maha-superuser sy avy amin'ny lahatahiry cron lehibe. Ireto antso manaraka ireto dia mamorona rakitra hidin-trano miaraka amin'ny PID amin'ny fizotran'ny daemon, ataovy azo antoka fa marina ny mpampiasa ary ovay ny lahatahiry amin'izao fotoana izao:

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

Ny lalana default dia napetraka, izay hampiasaina rehefa manomboka ny dingana:

setenv("PATH", _PATH_DEFPATH, 1);

Avy eo ny dingana dia "daemonized": mamorona dika mitovy amin'ny dingana amin'ny fiantsoana fork sy fivoriana vaovao amin'ny fizotran'ny zaza (miantso setsid). Tsy ilaina intsony ny fizotran'ny ray aman-dreny, ary mivoaka:

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

Ny fampitsaharana ny fizotran'ny ray aman-dreny dia mamoaka ny hidin-trano amin'ny rakitra hidin-trano. Ankoatra izany, ilaina ny manavao ny PID amin'ny rakitra ho an'ny ankizy. Aorian'izany dia fenoina ny angon-drakitra momba ny asa:

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

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

Avy eo ny cron dia mandroso mankany amin'ny tsingerin'ny asa lehibe. Saingy alohan'izany dia ilaina ny mijery ny fametrahana ny lisitry ny asa.

Manangona sy manavao ny lisitry ny asa

Ny fiasa load_database dia tompon'andraikitra amin'ny fametahana ny lisitry ny asa. Izy io dia manamarina ny crontab rafitra lehibe sy ny lahatahiry miaraka amin'ny rakitra mpampiasa. Raha tsy niova ny rakitra sy ny lahatahiry, dia tsy averina vakiana ny lisitry ny asa. Raha tsy izany dia manomboka miforona ny lisitry ny asa vaovao.

Fampidirana fisie rafitra misy rakitra manokana sy anarana latabatra:

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

Mametraka latabatra mpampiasa amin'ny 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);
}

Aorian'izay dia soloina vaovao ny tahiry taloha.

Ao amin'ireo ohatra etsy ambony ireo, ny antso process_crontab dia manamarina fa misy mpampiasa mifanandrify amin'ny anaran'ny rakitra latabatra (raha tsy hoe superuser) ary avy eo dia miantso load_user. Ity farany dia efa mamaky ny rakitra amin'ny andalana:

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

Eto, na ny fari-piainan'ny tontolo iainana dia napetraka (tsipika amin'ny endrika VAR=value) amin'ny fampiasana ny asa load_env / env_set, na ny famaritana ny asa dia vakiana (* * * * * /path/to/exec) amin'ny fampiasana ny fiasa load_entry.

Ny enti-miditra izay averin'ny load_entry dia ny asantsika, izay napetraka ao amin'ny lisitry ny asa ankapoben'ny asa. Ny fonctionna mihitsy no manao fanaparitahana verbose amin'ny endrika fotoana, saingy liana kokoa amin'ny fananganana ny fari-piainan'ny tontolo iainana sy ny mari-pamantarana fanombohana asa:

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

Ny loop lehibe dia miasa miaraka amin'ny lisitry ny asa ankehitriny.

Main Loop

Ny cron tany am-boalohany avy amin'ny Version 7 Unix dia niasa tsotra izao: namerina namaky ny fanitsiana tao anaty tadivavarana izy, nanomboka ny asan'ny minitra ankehitriny ho mpampiasa super, ary natory mandra-pahatongan'ny minitra manaraka. Nitaky loharanon-karena be loatra io fomba fiasa tsotra amin'ny milina tranainy io.

Nisy dikan-teny hafa naroso tao amin'ny SysV, izay natory ny daemon na mandra-pahatongan'ny minitra akaiky indrindra izay namaritana ilay asa, na nandritra ny 30 minitra. Vitsy kokoa ny loharanon-karena lanina tamin'ny famakiana indray ny fanitsiana sy ny fanamarinana ny asa amin'ity fomba ity, saingy nanjary tsy nety ny fanavaozana haingana ny lisitry ny asa.

Vixie cron dia niverina nanamarina ny lisitry ny asa indray mandeha isan-minitra, soa ihany fa tamin'ny faran'ny taona 80 dia nisy loharanon-karena bebe kokoa tamin'ny milina Unix mahazatra:

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

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

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

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

Ny asa cron_sleep dia mandray anjara mivantana amin'ny fanatanterahana asa, miantso ny asa job_runqueue (manisa sy manatanteraka asa) ary do_command (mitantana ny asa tsirairay). Ny asa farany dia mendrika hodinihina amin'ny antsipiriany bebe kokoa.

Manao asa

Ny asa do_command dia tanterahina amin'ny fomba Unix tsara, izany hoe, manao fork izy mba hanatanterahana ny asa asynchronously. Ny fizotry ny ray aman-dreny dia manohy manomboka asa, ny fizotry ny zaza dia manomana ny fizotran'ny asa:

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

Be dia be ny lojika ao amin'ny child_process: mila vokatra mahazatra sy mikoriana amin'ny tenany izy, mba handefasana azy amin'ny mailaka (raha voatondro ao amin'ny latabatra asa ny fari-piainan'ny MAILTO), ary farany, miandry ny lehibe. dingan'ny asa vita.

Ny fizotran'ny asa dia noforonin'ny fork iray hafa:

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

Amin'ny ankapobeny dia ny cron daholo izany. Tsy nesoriko ny antsipiriany mahaliana, ohatra, ny kaonty ho an'ny mpampiasa lavitra, fa nosoratako ny zava-dehibe indrindra.

afterword

Cron dia programa tsotra sy mahasoa, natao tamin'ny fomban-drazana tsara indrindra amin'ny tontolon'ny Unix. Tsy manao na inona na inona fanampiny izy, fa nanao ny asany tamin'ny fomba mahatalanjona nandritra ny am-polony taona maro izao. Naharitra adiny iray ny famakivakiana ny kaody ho an'ny dikan-teny miaraka amin'i Ubuntu, ary tena nahafinaritra ahy! Manantena aho fa afaka nizara izany taminareo.

Tsy haiko ny momba anao, fa somary malahelo aho mahatsapa fa ny fandaharana maoderina, miaraka amin'ny fironany manasarotra be loatra sy be loatra, dia tsy nahatonga ny fahatsorana toy izany hatry ny ela.

Misy safidy maoderina maro ho an'ny cron: ny systemd-timers dia mamela anao handamina rafitra sarotra miaraka amin'ny fiankinan-doha, ny fcron dia ahafahanao mifehy mora kokoa ny fampiasana loharanon-karena amin'ny asa. Fa ho ahy manokana dia ampy ho ahy foana ny crontab tsotra indrindra.

Raha fintinina, tiavo ny Unix, ampiasao programa tsotra ary aza adino ny mamaky ny mana ho an'ny sehatrao!

Source: www.habr.com

Add a comment