Cron in Linux: historia, usus et fabrica

Cron in Linux: historia, usus et fabrica

Classica scripsit horas laetas non vigilare. In illis temporibus silvestribus nec programmatores nec Unix fuerunt, sed programmata hodie pro certo sciunt: cron temporis pro illis vestigia servabunt.

Praecipe recta utilitas et infirmitas et chore pro me. sed, awk, wc, incisa et alia vetera programmata currunt a scriptoribus nostris quotidie servientibus. Multi ex eis designantur opera pro cron, schedula originaliter a 70s.

Diu cron leviter usa sum, nec in singula veniebam, sed die quodam, cum errorem currens offendi scriptionem, decrevi diligenter inspicere. Hoc modo hic articulus apparuit, dum scribens me cum POSIX crontab familiariter factum, praecipuae cron optiones in distributionibus popularibus Linux et structura quarundam earum.

Uteris Linux et currens cron muneribus? Esne interested in systema applicationis architecturae in Unix? Tunc iter nostrum sumus!

contentus

Origo specierum

Executio periodica programmatum utentis vel systematis evidens necessitas est in omnibus systematibus operantibus. Ideo programmatores intellexerunt necessitatem operarum quae media ad consilium et munera diu abhinc exercenda permittunt.

Unix-similis systemata operandi origines suas ad Versionem 7 Unix reducit, in 70s evoluta superiori seculi apud Bell Labs, inter celeberrima Ken Thompson. Versione 7 Unix etiam cron comprehendit, servitium pro labore superusoris regulariter currentem.

Nova cron typica programma simplex est, sed algorithmus operans versionis originalis etiam simplicior fuit: ministerium semel minutum evigilavit, mensam cum oneribus ex uno fasciculo (/etc/lib/crontab) legit et pro munere functus est. superuser ea officia quae praesenti tempore peragi debuerunt .

Postmodum emendatae versiones simplicium et utilitatum cum omnibus systematibus unix-similes operandi instructae sunt.

Descriptiones crontaborum formarum generatim ac praecipua principia operationis utilitatis comprehenderunt in principali norma systematis Unix-simile operantis - POSIX anno 1992, et sic cron ex signo facto de iure vexillum factus est.

Anno 1987, Paul Vixie, Unix utentes circa vota pro cron perspecta, aliam daemonis versionem dimisit quae nonnulla problemata cron traditae correxit et syntaxin tabellariorum ampliavit.

Per tertiam versionem Vixie cron occurrere coepit requisitis POSIX, insuper programmatis licentiam habuit liberalem, immo nulla omnino licentia fuit, praeter vota in README: auctor spondeum non dat, auctoris nomen. deleri non potest, et progressio nonnisi cum codice fonte vendi potest. Haec requisita evaserunt ut starent cum principiis gratuiti programmatis quae illis annis favorem conciliabat, ideo nonnullae distributionum clavium Linux, quae in primis 90s apparuerunt, Vixie cron pro systemate suo unum acceperunt et hodie adhuc enucleantur.

Praesertim, Red Hat et SUSE fuscinulam Vixie cron - cronii explicant, et Debian et Ubuntu editionem originalem Vixie cron cum multis inaequalitatibus utuntur.

Primum cognoscamus de usuario crontab descripto in POSIX, post quod videbimus extensiones syntaxin quae in Vixie cron et usum variationum Vixie cron in distributionibus popularibus Linux. Denique cerasus in placenta est analysis cron daemonis fabrica.

POSIX crontab

Si cron originale semper pro superusore laboravit, recentiores schedulae saepe operas agunt de usoribus ordinariis, quae securior et commoda est.

Crons in duobus programmatis statuto suppletur: cron daemon assiduus et utilitas crontab utentibus praesto sunt. Haec tibi permittit ut munus tabulae propriae cuique usoris in systematis recenseas, dum daemon operas ab usuario et ratiociniis tabulis immittit.

В POSIX vexillum mores daemonis nullo modo descriptus est et tantum programmatis usoris conformatur crontab. Mechanismi exsistentia ad usorum opera deducenda est, quidem, implicata, sed non explicata.

Cum utilitatem crontab vocando, quattuor res facere potes: usoris munus in editore edit, mensam ex tabella onerabis, current negotium mensam ostende, et negotium mensa purga. Exempla quomodo crontab opera utilitatis;

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

cum vocantem crontab -e editorem certa in vexillum environment variabilis utendum erit EDITOR.

Ipsa opera in sequenti forma describuntur:

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

Primae quinque agri monumentorum: minuta [1..60], horae [0..23], dies mensis [1..31], menses [1..12], dies hebdomadis [0. .6], ubi est dominica 0 . Postremus, sextus, ager est linea, quae a vexillo mandati interpretis exsecuta erit.

In primis quinque agris, valores separati per commata recenseri possunt;

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

Aut cum hyphen:

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

Usoris accessus ad negotium schedulingum ordinatur in POSIX per cron.passiones et cron.deny, quae indices utentes cum accessu ad crontab et utentes sine accessu ad programmata, respective. Vexillum locum harum imaginum nullo modo moderatur.

Secundum vexillum, saltem quattuor variabilium ambitus ad programmata deducenda tradenda sunt:

  1. HOME - usoris domus presul.
  2. LOGNAME — login usoris.
  3. ITER est via ubi normae utilitatis ratio reperire potes.
  4. COCHLEA — iter ad usos interpretes mandatum.

Egregie, POSIX nihil de dicit ubi valores harum variabilium oriuntur.

Optimus vendit - Vixie cron 3.0pl1

Communis antecessor variantium vulgarium cron Vixie cron 3.0pl1 est, in comp.sources.unix list Mailing anno 1992 introductus. Praecipua lineamenta huius versionis planius considerabimus.

Vixie cron in duobus programmatis venit (cron et crontab). Ut solet, daemon responsabilis est legendi et currendi operas ex tabularum rationibus et singulis tabulis usoris usoris, et utilitas crontab usoris tabulas emendandi responsabilis est.

Negotium mensam et configuratione files

Superuser opus mensae in /etc/crontab sita est. Syntaxis tabulae systematis respondet syntaxi Vixie cron, excepto quod sexta columna in ea indicat nomen utentis sub cuius nomine negotium emittitur;

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

Regularis usoris negotium tabulae in /var/cron/tabs/usoris usoris collocantur atque eadem syntaxi utuntur. Cum utilitatem crontab utentis incurras, hae sunt tabulae quae recensitae sunt.

Indices usorum cum accessu ad crontab administrantur in /var/cron/permitte et /var/cron/negare lima, ubi tantum opus es nomen usoris in linea separata.

Syntax extensa

Cum POSIX crontab comparatus, solutio Pauli Vixey plures modificationes utilissimas continet ad syntaxin tabularum officiorum utilitatis.

Nova syntaxis tabula in promptu facta est: exempli gratia, nominatim dies hebdomadis vel mensium nominare potes (Mon, Tue et sic deinceps);

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

Denotare potes gradum per quem opera immittuntur:

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

Gradus et intervalla misceri possunt;

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

Optio intuitiva ad syntaxin solitam sustentantur (reboot annuos, annuatim, menses, septimanas, quotidianas, medias noctes, horas);

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

Negotium supplicium environment

Vixie cron permittit te mutare ambitum applicationum cursus.

Ambitus variabiles USUTOR, LOGNAME et HOME non solum a daemone provisae sunt, sed e lima eximuntur passwd. PATH variabilis "/usr/bin:/bin" apponitur et concha variabilis "/bin/sh" apponitur. Valores omnium variabilium praeter LOGNAME in tabulis usoris mutari possunt.

Nonnullae variabiles ambitus ( notissime concha et HOME ) ab ipso cronvo ad negotium currendum adhibentur. Hic est quid usus vercundus pro vexillum sh ad operas consuetudinis currendas ut tamquam:

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

Postremo omnes variabiles ambitus in tabula definita (per cron vel processu necessaria) ad negotium currente mittentur.

Ad fasciculos recensendos, crontab utitur editor de quibus in variabili ambitu VISUAL vel EDITOR. Si ambitus ubi crontab currebatur, has variabiles definitas non habet, tunc "/usr/ucb/vi" dicitur (ucb verisimiliter Universitas Californiae, Berkeley).

cron in Debian et Ubuntu

Tincimenta Debian et derivativae distributiones dimiserunt valde mutatio versionem Vixie cron version 3.0pl1. Differentiae sunt in syntaxi tabellariorum tabularum, nam utentes idem est Vixie cron. Maxima nova Feature: Support syslog, SELinux и Vo.

Minus notabilis, sed mutationes tangibiles locum includunt tabularum configurationis et tabularum molis.

Tabulae usoris in Debian sunt in directorio /var/spool/cron/crontabs sita, tabula systematis adhuc ibi est - in /etc/crontab. Tabulae sarcinarum specialium in /etc/cron.d positae sunt, unde automatice cron daemonis eas legit. Aditus usoris imperium a /etc/cron.allow et /etc/cron.deny refrenatur.

Concha defalta adhuc /bin/sh, quae in Debian est testa parva POSIX-facilis offendasemissa, sine ullo configuratione legendo (modo non-interactive).

Cron ipsum in ultimis versionibus Debian via systemd educitur, et figuratio launchum in /lib/systemd/system/cron.service spectari potest. Nihil speciale in configuratione servitii, quaelibet procuratio subtilior fieri potest per variabiles ambitus in crontab cuiusque usuarii directe declaravit.

cronie in RedHat, Fedora et CentOS

cronie — furca de Vixie versio cron 4.1. Ut apud Debian, syntaxin non mutata est, sed subsidium PAM et SELinux, in botro laborantes, lima lima utentes inotify et alia lineamenta addita sunt.

Configuratio defectus in locis solitis est: mensa systematis in /etc/crontab, fasciculi tabulas suas in /etc/cron.d ponunt, tabulae usoris in /var/spool/cron/crontabs ingrediuntur.

Daemon in potestate systema decurrit, servitus figuratio /lib/systemd/system/crond.service.

In Red Hat-similes distributiones, /bin/sh per default ad satus usus adhibetur, quod est norma vercundus. Animadvertendum est, cum jobs cron currit per /bin/sh, testa verna in modo posIX-obsequio incipit et nullum legitimum schematismum legit, in modo interactivo non currit.

cronie in SLES et openSUSE

The German distribution SLES and its derivative openSUSE eadem cronia utuntur. Daemon hic etiam sub systemd emittitur, ministerium figurae in /usr/lib/systemd/system/cron.service situm est. Configurationis: /etc/crontab, /etc/cron.d, /var/spool/cron/tabs. /Bin/sh idem est vercundus cursus in POSIX-obsequio non-interactivo modo.

Vixie cron fabrica

Posteri cron moderni radicaliter Vixie cron mutati non sunt, sed adhuc novas notas acquisitas quae programmatis principia intelligere non debent. Multae harum extensionum male dispositae sunt et codicem confundunt. Originale cron source code by Paul Vixey legere iuvat.

Ideo fabricam cron analysim constitui utens exemplo cron programma commune utrique evolutionis rami - Vixie cron 3.0pl1. Exempla simpliciorem reddere faciam, removendo ifdefs quae inpediunt lectioni et omissis minutiis.

Opus autem Daemonis potest in plures gradus dividi.

  1. Programma initialization.
  2. Colligendi et augendi indicem operum ad currendum.
  3. Praecipua cron ansa currit.
  4. Incipit opus.

Intueamur eos ordine.

initialization

Cum incepit, post rationes processus iniectas, cron signum SIGCHLD et SIGHUP tractatores inaugurat. Primum unum truncum ingressum circa pueri processus terminationem facit, secunda tabella descriptor tabellae stipendii claudit:

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

Cronus daemon semper solus in systemate currit, solum ut superuser et a principali cron presul. Sequentia vocat limam seriam cum processu daemonis PID creare, fac utentis rectam ac mutationem directorii hodierni ad principale:

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

Semita defalta ponitur, quae in processibus incipiendis adhibebitur;

setenv("PATH", _PATH_DEFPATH, 1);

Tunc processus "daemonizatus" est: puerum exemplar processus creat vocans furcam et novam sessionem in processu infantis (vocans setid). Parentis processus iam non est necessarius et exit;

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

Processus terminationis parentis seram in fasciculo cincinno dimittit. Praeterea oportet PID in tabella puero renovare. Post hoc negotium datorum impletur:

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

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

Inde cron moveatur in cyclum principale operis. Sed ante ipsum, pretium eget, at sollicitudin elit.

Colligendis et adaequationis negotium album

Munus onus_database responsabile est ad onerandas indicem operum. Continet systema principale crontablum et indicem cum fasciculis usoris. Si lima et directoria non mutata sunt, negotium album non re-legitur. Alioquin novum indicem officiorum formare incipit.

Fasciculus systema oneratum cum specialibus fasciculis et nominibus mensae:

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

User tabulae Loading in 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);
}

Post quem vetus database cum novo substituitur.

In exemplis supra, munus processus_crontab vocant certificat nomen usoris adaptans tabellae tabellae (nisi superuser est) et tunc vocat load_user. Ipse tabella lineam in linea iam legit:

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

Hic, vel ambitus variabilis ponitur (lineae formae VAR=valuitatis) utens onere_env / env_set functionum, vel descriptio operis legitur (* * * * /path/to/exec) functionis oneris_entryi utens.

Entry ingressum quod onus_entry redit, nostrum est munus, quod in generali officiorum indice positum est. Munus ipsum parsing verbosum temporis format, sed magis interest in variabilium rerum formatione ac laboris ambitus parametri;

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

Praecipua fascia laborat cum indice operum recenti.

Pelagus loop

Originale cron e Versione 7 Unix satis simpliciter laboravit: illam configurationem in ansa re- legit, operas currentis minuti superusoris imposuit, et dormivit usque ad initium proximi minuti. Simplex haec accessio in machinis vetustis nimis multae opes requiruntur.

Jocus versio in SysV proposita est, in qua daemon dormiebat vel usque ad proximum minutam pro quo definitum erat negotium, vel per 30 minuta. Paucioribus facultatibus absumpti sunt ad conformationem et reprimendam opera in hoc modo legendi, sed cito adaequationis indicem officiorum incommodum factum est.

Vixie cron rediit ad tabulas reprimendas semel minutas, feliciter in fine 80s machinis Unix vexillum signanter plus opes erant;

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

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

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

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

Munus cron_somnus directe implicatur in muneribus exsequendis, vocatum job_runqueue (enumerare et currunt functiones) et do_ mandatum (singulum negotium currunt) functiones. Ultimum munus fusius examinare valet.

Currens negotium

Munus do_ mandatum exercetur in stilo Unix bono, id est, furca ad munus asynchronously perficiendum. Processus parentis opera mittere pergit, puer processus negotium praeparat;

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

Est admodum multum logica in child_processus: vexillum outputum et errorem in se fluminum capit, ut deinde eam mittat (si MAILTO ambitus variabilis in tabula penso specificatur), et denique principale observat. processum operis absolvere.

Negotium processus ab alio furca formatur:

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

Id fere omne cron est. Singula quaedam intermisi interesting, exempli gratia, rationem remotis usoribus, sed summa res delineavi.

afterword

Cron progressio est mirae simplex et utilis, in optimis traditionibus Unix mundi facta. Nihil extra facit, sed officium suum mirifice aliquot decenniis nunc egit. Questus per codicem pro versione quae cum Ubuntu venit non plus quam horam sumpsit, et multum iocum habui! Spero me tecum communicare potui.

Nescio de te, sed parum doleo scire programmatum modernum, sua inclinatione ad nimium incomplicatum et nimis abstractum, ad tantam simplicitatem diu non conduxisse.

Multa modernorum optio ad cron: systemd-timers permittit te complexum systematum cum dependentiis instituere, fcron te permittit ut subsidiorum consummatio per munia mollius moderari sinat. Sed personaliter crontab simplicissima semper satis mihi fuit.

In summa, ama Unix, rationibus simplicibus utere et mana legere pro suggestu tuo noli oblivisci!

Source: www.habr.com

Add a comment