Linux жүйесіндегі Cron: тарих, пайдалану және құрылғы

Linux жүйесіндегі Cron: тарих, пайдалану және құрылғы

Классик бақытты сағаттар қарамайды деп жазды. Сол жабайы заманда бағдарламашылар да, Unix те болған жоқ, бірақ бүгінде бағдарламашылар нақты біледі: cron олардың орнына уақытты бақылайды.

Командалық жолдың утилиталары мен үшін әрі әлсіздік, әрі жұмыс. sed, awk, wc, cut және басқа да ескі бағдарламалар серверлерімізде күн сайын сценарийлер арқылы іске қосылады. Олардың көпшілігі 70-ші жылдардағы жоспарлаушы cron үшін тапсырмалар ретінде жасалған.

Ұзақ уақыт бойы мен егжей-тегжейге тоқталмай, cron-ды үстірт қолдандым, бірақ бір күні сценарийді іске қосу кезінде қатеге тап болғанда, мен оны мұқият қарастыруды шештім. Бұл мақала осылай пайда болды, оны жазу барысында мен POSIX crontab, танымал Linux дистрибутивтеріндегі негізгі cron опцияларымен және олардың кейбіреулерінің құрылымымен таныстым.

Сіз Linux пайдаланасыз ба және cron тапсырмаларын орындайсыз ба? Сіз Unix жүйесіндегі жүйелік қолданбалардың архитектурасына қызығасыз ба? Онда біз жолға шығамыз!

Мазмұны

Түрлердің шығу тегі

Пайдаланушы немесе жүйелік бағдарламаларды кезеңді түрде орындау барлық операциялық жүйелерде айқын қажеттілік болып табылады. Сондықтан бағдарламашылар тапсырмаларды орталықтандырылған түрде жоспарлауға және орындауға мүмкіндік беретін қызметтердің қажеттілігін бұрыннан түсінді.

Unix-тәрізді операциялық жүйелер өткен ғасырдың 7-жылдарында Bell Labs зертханасында, оның ішінде әйгілі Кен Томпсон әзірлеген Unix 70 нұсқасынан бастау алады. Unix 7-нұсқасында сонымен қатар суперпайдаланушы тапсырмаларын тұрақты орындауға арналған cron қызметі бар.

Кәдімгі заманауи cron - бұл қарапайым бағдарлама, бірақ бастапқы нұсқаның жұмыс алгоритмі одан да қарапайым болды: қызмет минутына бір рет оянды, бір файлдағы тапсырмалары бар кестені оқиды (/etc/lib/crontab) және қазіргі уақытта орындалуы тиіс тапсырмаларды суперпайдалану.

Кейіннен қарапайым және пайдалы қызметтің жетілдірілген нұсқалары барлық Unix тәрізді операциялық жүйелермен жеткізілді.

crontab пішімінің жалпылама сипаттамасы және утилита жұмысының негізгі принциптері 1992 жылы Unix-тәрізді операциялық жүйелердің негізгі стандартына – POSIX-ке енгізілді, осылайша де-факто стандартынан cron де-юре стандартқа айналды.

1987 жылы Пол Викси Unix пайдаланушыларының cron-ға деген тілектері туралы сауалнама жүргізе отырып, дәстүрлі cron-ның кейбір мәселелерін түзететін және кесте файлдарының синтаксисін кеңейтетін демонның басқа нұсқасын шығарды.

Vixie cron үшінші нұсқасы бойынша POSIX талаптарына жауап бере бастады, сонымен қатар, бағдарламаның либералды лицензиясы болды, дәлірек айтсақ, README-дегі тілектерді қоспағанда, лицензия мүлдем болмады: автор кепілдік бермейді, автордың аты-жөні. жою мүмкін емес және бағдарламаны тек бастапқы кодпен бірге сатуға болады. Бұл талаптар сол жылдары танымал бола бастаған тегін бағдарламалық қамтамасыз ету принциптерімен үйлесімді болды, сондықтан 90-шы жылдардың басында пайда болған кейбір негізгі Linux дистрибутивтері Vixie cron-ды жүйе ретінде қабылдады және оны әлі де дамытуда.

Атап айтқанда, Red Hat және SUSE Vixie cron - cronie шанышқысын әзірлейді, ал Debian мен Ubuntu көптеген патчтары бар Vixie cron-ның түпнұсқалық шығарылымын пайдаланады.

Алдымен POSIX-те сипатталған crontab пайдаланушы утилитасымен танысайық, содан кейін біз Vixie cron-да берілген синтаксистік кеңейтімдерді және танымал Linux дистрибутивтерінде Vixie cron вариацияларын пайдалануды қарастырамыз. Соңында, торттағы шие - cron демон құрылғысының талдауы.

POSIX crontab

Түпнұсқа cron әрқашан суперпайдаланушы үшін жұмыс істесе, заманауи жоспарлаушылар жиі қарапайым пайдаланушылардың тапсырмаларымен айналысады, бұл қауіпсіз және ыңғайлы.

Крондар екі бағдарламаның жиынтығы ретінде жеткізіледі: тұрақты жұмыс істейтін cron демоны және пайдаланушыларға қолжетімді crontab утилитасы. Соңғысы жүйедегі әрбір пайдаланушыға тән тапсырмалар кестелерін өңдеуге мүмкіндік береді, ал демон пайдаланушы және жүйелік кестелерден тапсырмаларды іске қосады.

В POSIX стандарты демонның мінез-құлқы ешқандай түрде сипатталмаған және тек пайдаланушы бағдарламасы ресімделеді Crontab. Пайдаланушы тапсырмаларын іске қосу механизмдерінің болуы, әрине, болжанған, бірақ егжей-тегжейлі сипатталмаған.

crontab утилитасына қоңырау шалу арқылы төрт әрекетті орындауға болады: пайдаланушының тапсырмалар кестесін өңдегіште өңдеу, кестені файлдан жүктеу, ағымдағы тапсырмалар кестесін көрсету және тапсырмалар кестесін тазалау. crontab утилитасының жұмыс істеу мысалдары:

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

Шақырғанда crontab -e стандартты орта айнымалысында көрсетілген өңдегіш пайдаланылады EDITOR.

Тапсырмалардың өзі келесі форматта сипатталған:

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

Жазбалардың алғашқы бес өрісі: минуттар [1..60], сағаттар [0..23], ай күндері [1..31], айлар [1..12], апта күндері [0. .6], мұнда 0 – жексенбі. Соңғы, алтыншы, өріс стандартты командалық интерпретатормен орындалатын жол болып табылады.

Алғашқы бес өрісте мәндерді үтірмен бөлуге болады:

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

Немесе дефис арқылы:

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

Пайдаланушының тапсырмаларды жоспарлауға қол жеткізуі POSIX жүйесінде cron.allow және cron.deny файлдарымен реттеледі, олар сәйкесінше crontab бағдарламасына қатынасы бар пайдаланушыларды және бағдарламаға қатынасы жоқ пайдаланушыларды тізімдейді. Стандарт бұл файлдардың орналасуын ешқандай жолмен реттемейді.

Стандартқа сәйкес іске қосылған бағдарламаларға кемінде төрт орта айнымалысы берілуі керек:

  1. HOME – пайдаланушының үй каталогы.
  2. LOGNAME — пайдаланушының кіруі.
  3. PATH – стандартты жүйелік утилиталарды табуға болатын жол.
  4. SHELL — пайдаланылған команда интерпретаторына жол.

Айта кетейік, POSIX бұл айнымалы мәндердің қайдан келетіні туралы ештеңе айтпайды.

Ең жақсы сатушы - Vixie cron 3.0pl1

Танымал cron нұсқаларының ортақ атасы - 3.0 жылы comp.sources.unix тарату тізімінде енгізілген Vixie cron 1pl1992. Біз осы нұсқаның негізгі мүмкіндіктерін толығырақ қарастырамыз.

Vixie cron екі бағдарламада (cron және crontab) келеді. Әдеттегідей, демон жүйелік тапсырмалар кестесінен және жеке пайдаланушы тапсырмалар кестелерінен тапсырмаларды оқуға және іске қосуға жауапты, ал crontab утилитасы пайдаланушы кестелерін өңдеуге жауапты.

Тапсырмалар кестесі және конфигурация файлдары

Суперпайдаланушы тапсырмаларының кестесі /etc/crontab ішінде орналасқан. Жүйелік кестенің синтаксисі Vixie cron синтаксисіне сәйкес келеді, тек ондағы алтыншы баған оның атынан тапсырма іске қосылған пайдаланушының атын көрсетеді:

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

Тұрақты пайдаланушы тапсырмалары кестелері /var/cron/tabs/username ішінде орналасқан және бірдей синтаксисті пайдаланады. Пайдаланушы ретінде crontab қызметтік бағдарламасын іске қосқан кезде, бұл өңделетін файлдар.

Crontab қолданбасына рұқсаты бар пайдаланушылардың тізімдері /var/cron/allow және /var/cron/deny файлдарында басқарылады, мұнда пайдаланушы атын бөлек жолға енгізу жеткілікті.

Кеңейтілген синтаксис

POSIX crontab-пен салыстырғанда, Пол Виксидің шешімі утилитаның тапсырмалар кестелерінің синтаксисіне бірнеше өте пайдалы модификацияларды қамтиды.

Жаңа кесте синтаксисі қол жетімді болды: мысалы, аптаның күндерін немесе айларды атау бойынша көрсетуге болады (Дүйсенбі, Сейсенбі, т.б.):

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

Тапсырмалар іске қосылатын қадамды көрсетуге болады:

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

Қадамдар мен аралықтарды араластыруға болады:

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

Әдеттегі синтаксиске интуитивті баламаларға қолдау көрсетіледі (қайта жүктеу, жыл сайын, жыл сайын, ай сайын, апта сайын, күнделікті, түн ортасында, сағат сайын):

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

Тапсырманы орындау ортасы

Vixie cron іске қосылған қолданбалардың ортасын өзгертуге мүмкіндік береді.

USER, LOGNAME және HOME ортасының айнымалы мәндері демонмен қамтамасыз етілмейді, олар файлдан алынған. passwd. PATH айнымалысы "/usr/bin:/bin" мәніне орнатылған, ал SHELL айнымалысы "/bin/sh" мәніне орнатылған. LOGNAME-ден басқа барлық айнымалылардың мәндерін пайдаланушы кестелерінде өзгертуге болады.

Кейбір орта айнымалы мәндерін (ең алдымен SHELL және HOME) тапсырманы орындау үшін cron өзі пайдаланады. Пайдаланушы тапсырмаларын орындау үшін стандартты sh ​​орнына bash пайдалану келесідей болуы мүмкін:

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

Сайып келгенде, кестеде анықталған барлық орта айнымалылары (cron арқылы пайдаланылады немесе процесс қажет) орындалатын тапсырмаға жіберіледі.

Файлдарды өңдеу үшін crontab VISUAL немесе EDITOR ортасының айнымалы мәнінде көрсетілген өңдегішті пайдаланады. Егер crontab іске қосылған ортада бұл айнымалы мәндер анықталмаса, "/usr/ucb/vi" пайдаланылады (ucb Калифорния университеті, Беркли болуы мүмкін).

Debian және Ubuntu жүйелеріндегі cron

Debian және туынды дистрибутивтерді әзірлеушілер шығарды жоғары өзгертілген нұсқасы Vixie cron нұсқасы 3.0pl1. Кесте файлдарының синтаксисінде ешқандай айырмашылықтар жоқ, пайдаланушылар үшін бұл бірдей Vixie cron. Ең үлкен жаңа мүмкіндік: Қолдау syslog, SELinux и PAM.

Азырақ байқалатын, бірақ елеулі өзгерістер конфигурация файлдарының және тапсырмалар кестелерінің орналасуын қамтиды.

Debian-дағы пайдаланушы кестелері /var/spool/cron/crontabs каталогында орналасқан, жүйелік кесте әлі де бар - /etc/crontab ішінде. Debian пакетіне арналған тапсырмалар кестелері /etc/cron.d ішіне орналастырылады, сол жерден cron демоны оларды автоматты түрде оқиды. Пайдаланушы қатынасын басқару /etc/cron.allow және /etc/cron.deny файлдары арқылы басқарылады.

Әдепкі қабық әлі де /bin/sh болып табылады, ол Debian-да POSIX-үйлесімді шағын қабық болып табылады. сызықша, ешбір конфигурацияны оқымай іске қосылды (интерактивті емес режимде).

Debian соңғы нұсқаларында Cron өзі systemd арқылы іске қосылады және іске қосу конфигурациясын /lib/systemd/system/cron.service ішінде көруге болады. Қызмет конфигурациясында ерекше ештеңе жоқ; кез келген күрделірек тапсырманы басқару әр пайдаланушының crontab бөлімінде тікелей жарияланған ортаның айнымалы мәндері арқылы жасалуы мүмкін.

RedHat, Fedora және CentOS жүйелеріндегі достар

cronie — Vixie cron 4.1 нұсқасының шанышқысы. Debian-дағыдай синтаксис өзгерген жоқ, бірақ PAM және SELinux қолдауы, кластерде жұмыс істеу, inotify көмегімен файлдарды бақылау және басқа мүмкіндіктер қосылды.

Әдепкі конфигурация әдеттегі орындарда: жүйелік кесте /etc/crontab ішінде, пакеттер өз кестелерін /etc/cron.d ішіне орналастырады, пайдаланушы кестелері /var/spool/cron/crontabs ішіне кіреді.

Демон жүйелік басқару астында жұмыс істейді, қызмет конфигурациясы - /lib/systemd/system/crond.service.

Red Hat тәрізді дистрибутивтерде әдепкі бойынша іске қосу кезінде /bin/sh пайдаланылады, бұл стандартты bash. /bin/sh арқылы cron тапсырмаларын орындау кезінде bash қабықшасы POSIX-үйлесімді режимде іске қосылатынын және интерактивті емес режимде жұмыс істейтін ешқандай қосымша конфигурацияны оқымайтынын атап өткен жөн.

SLES және openSUSE жүйесіндегі cronie

Неміс тарату SLES және оның туындысы openSUSE бірдей cronie пайдаланады. Мұндағы демон systemd астында іске қосылады, қызмет конфигурациясы /usr/lib/systemd/system/cron.service ішінде орналасқан. Конфигурация: /etc/crontab, /etc/cron.d, /var/spool/cron/tabs. /bin/sh - POSIX-үйлесімді интерактивті емес режимде жұмыс істейтін бірдей bash.

Vixie cron құрылғысы

Қазіргі заманғы крон ұрпақтары Vixie cron-мен салыстырғанда түбегейлі өзгерген жоқ, бірақ әлі де бағдарламаның принциптерін түсіну үшін қажет емес жаңа мүмкіндіктерге ие болды. Бұл кеңейтімдердің көпшілігі нашар жобаланған және кодты шатастырады. Пол Виксидің түпнұсқалық cron бастапқы коды оқуға қуанышты.

Сондықтан мен cron құрылғысын екі даму саласына ортақ cron бағдарламасының мысалын қолданып талдауды шештім - Vixie cron 3.0pl1. Мен оқуды қиындататын ifdef файлдарын алып тастап, ұсақ бөлшектерді жіберіп, мысалдарды жеңілдетемін.

Жынның жұмысын бірнеше кезеңге бөлуге болады:

  1. Бағдарламаны инициализациялау.
  2. Орындалатын тапсырмалар тізімін жинау және жаңарту.
  3. Негізгі cron циклі жұмыс істейді.
  4. Тапсырманы бастау.

Оларды ретімен қарастырайық.

Инициализация

Іске қосылған кезде, процесс аргументтерін тексергеннен кейін cron SIGCHLD және SIGHUP сигнал өңдеушілерін орнатады. Біріншісі еншілес процестің аяқталуы туралы журнал жазбасын жасайды, екіншісі журнал файлының файл дескрипторын жабады:

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

Cron демоны әрқашан жүйеде жалғыз жұмыс істейді, тек суперпайдаланушы ретінде және негізгі cron каталогынан. Келесі қоңыраулар демон процесінің PID коды бар құлыптау файлын жасайды, пайдаланушының дұрыс екеніне көз жеткізіп, ағымдағы каталогты негізгіге өзгертеді:

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

Әдепкі жол орнатылды, ол процестерді бастаған кезде пайдаланылады:

setenv("PATH", _PATH_DEFPATH, 1);

Содан кейін процесс «демонизацияланады»: ол форкты шақыру және еншілес процестегі жаңа сеанс (setsid шақыру) арқылы процестің еншілес көшірмесін жасайды. Негізгі процесс енді қажет емес және ол шығады:

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

Негізгі процесті тоқтату құлыптау файлындағы құлыпты босатады. Сонымен қатар, балаға файлдағы PID-ні жаңарту қажет. Осыдан кейін тапсырма деректер базасы толтырылады:

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

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

Содан кейін cron негізгі жұмыс цикліне көшеді. Бірақ бұған дейін тапсырмалар тізімін жүктеуді қарастырған жөн.

Тапсырмалар тізімін жинау және жаңарту

load_database функциясы тапсырмалар тізімін жүктеуге жауап береді. Ол негізгі жүйе crontab және пайдаланушы файлдары бар каталогты тексереді. Егер файлдар мен каталог өзгермесе, тапсырмалар тізімі қайта оқылмайды. Әйтпесе, тапсырмалардың жаңа тізімі қалыптаса бастайды.

Арнайы файл және кесте атаулары бар жүйелік файлды жүктеу:

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

Пайдаланушы кестелерін циклге жүктеу:

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

Осыдан кейін ескі деректер базасы жаңасымен ауыстырылады.

Жоғарыдағы мысалдарда process_crontab функциясының шақыруы кесте файлының атына сәйкес келетін пайдаланушының бар екенін тексереді (ол суперпайдаланушы болмаса), содан кейін load_user шақырады. Соңғысы файлдың өзін жол-жол оқиды:

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

Мұнда не орта айнымалысы load_env / env_set функцияларын пайдаланып орнатылады (VAR=мән пішімінің жолдары) немесе load_entry функциясы арқылы тапсырма сипаттамасы оқылады (* * * * * /path/to/exec).

load_entry қайтаратын жазба нысаны - бұл тапсырмалардың жалпы тізімінде орналастырылған біздің тапсырма. Функцияның өзі уақыт пішімін егжей-тегжейлі талдауды жүзеге асырады, бірақ бізді қоршаған ортаның айнымалы мәндерін және тапсырманы іске қосу параметрлерін қалыптастыру көбірек қызықтырады:

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

Негізгі цикл ағымдағы тапсырмалар тізімімен жұмыс істейді.

Негізгі цикл

Unix 7-нұсқасындағы түпнұсқа cron өте қарапайым жұмыс істеді: ол конфигурацияны циклде қайта оқыды, суперпайдаланушы ретінде ағымдағы минуттың тапсырмаларын іске қосты және келесі минуттың басына дейін ұйықтады. Ескі машиналардағы бұл қарапайым тәсіл тым көп ресурстарды қажет етті.

SysV-де баламалы нұсқа ұсынылды, онда демон тапсырма анықталған ең жақын минутқа дейін немесе 30 минутқа ұйықтады. Бұл режимде конфигурацияны қайта оқу және тапсырмаларды тексеру үшін ресурстар азырақ жұмсалды, бірақ тапсырмалар тізімін жылдам жаңарту ыңғайсыз болды.

Vixie cron минутына бір рет тапсырмалар тізімдерін тексеруге оралды, бақытымызға орай, 80-жылдардың аяғында стандартты Unix машиналарында ресурстар айтарлықтай көп болды:

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

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

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

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

cron_sleep функциясы тапсырмаларды орындауға тікелей қатысады, job_runqueue (тапсырмаларды санау және іске қосу) және do_command (әр жеке тапсырманы орындау) функцияларын шақырады. Соңғы функцияны толығырақ қарастырған жөн.

Тапсырманы орындау

do_command функциясы жақсы Unix стилінде орындалады, яғни тапсырманы асинхронды түрде орындау үшін шанышқы жасайды. Негізгі процесс тапсырмаларды іске қосуды жалғастырады, еншілес процесс тапсырма процесін дайындайды:

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

Child_process ішінде өте көп логика бар: ол стандартты шығыс пен қате ағындарын өзіне алады, содан кейін оны поштаға жіберу үшін (егер MAILTO ортасының айнымалы мәні тапсырмалар кестесінде көрсетілген болса) және, ең соңында, негізгі ақпаратты күтеді. тапсырманы орындау процесі.

Тапсырма процесі басқа шанышқымен қалыптасады:

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

Бұл негізінен барлық cron. Мен кейбір қызықты мәліметтерді жіберіп алдым, мысалы, қашықтағы пайдаланушыларды есепке алу, бірақ мен бастысын атап өттім.

Кейінгі сөз

Cron - Unix әлемінің ең жақсы дәстүрлерінде жасалған таңқаларлық қарапайым және пайдалы бағдарлама. Ол артық ештеңе жасамайды, бірақ ол бірнеше ондаған жылдар бойы өз жұмысын тамаша атқарып келеді. Ubuntu-мен бірге келетін нұсқаның кодын алу бір сағаттан аспады, мен өте қызық болдым! Сізбен бөлісе алдым деп үміттенемін.

Мен сіз туралы білмеймін, бірақ мен қазіргі заманғы бағдарламалаудың шамадан тыс күрделі және абстрактілі болуы ұзақ уақыт бойы мұндай қарапайымдылыққа көмектеспегенін түсінгеніме аздап қынжыламын.

Cron-ға көптеген заманауи баламалар бар: systemd-таймерлер тәуелділіктері бар күрделі жүйелерді ұйымдастыруға мүмкіндік береді, fcron тапсырмалар бойынша ресурстарды тұтынуды икемді түрде реттеуге мүмкіндік береді. Бірақ жеке өзім үшін ең қарапайым crontab әрқашан жеткілікті болды.

Бір сөзбен айтқанда, Unix-ті жақсы көріңіз, қарапайым бағдарламаларды пайдаланыңыз және платформаңыз үшін мананы оқуды ұмытпаңыз!

Ақпарат көзі: www.habr.com

пікір қалдыру