Cron дар Linux: таърих, истифода ва дастгоҳ

Cron дар Linux: таърих, истифода ва дастгоҳ

Классик навиштааст, ки соатҳои хушбахт тамошо намекунанд. Дар он замонҳои ваҳшӣ на барномасозон буданд ва на Unix, аммо имрӯз барномасозон аниқ медонанд: cron ба ҷои онҳо вақтро ҳисоб мекунад.

Утилитҳои сатри фармон барои ман ҳам заъф ва ҳам кори душвор аст. sed, awk, wc, cut ва дигар барномаҳои кӯҳна бо скриптҳо дар серверҳои мо ҳар рӯз иҷро мешаванд. Бисёре аз онҳо ҳамчун вазифаҳо барои cron тарҳрезӣ шудаанд, як нақшакаш аз солҳои 70-ум.

Муддати тӯлонӣ ман cron-ро рӯякӣ, бидуни ба тафсилот ворид кардан истифода кардам, аммо рӯзе, вақте ки ман ҳангоми иҷро кардани скрипт ба хатогӣ дучор шудам, ман тасмим гирифтам, ки онро ҳамаҷониба тафтиш кунам. Ҳамин тавр ин мақола пайдо шуд ва ҳангоми навиштани он ман бо POSIX crontab, вариантҳои асосии cron дар дистрибюторҳои маъмули Linux ва сохтори баъзеи онҳо шинос шудам.

Оё шумо Linux-ро истифода мебаред ва вазифаҳои cron -ро иҷро мекунед? Оё шумо ба меъмории барномаҳои системавӣ дар Unix таваҷҷӯҳ доред? Пас мо дар роҳ ҳастем!

Мундариҷа

Пайдоиши намудҳо

Иҷрои даврии барномаҳои корбар ё система дар ҳама системаҳои оператсионӣ як зарурати возеҳ аст. Аз ин рӯ, барномасозон зарурати хидматҳоро дарк карданд, ки ба онҳо имкон медиҳанд, ки вазифаҳоро ба таври мутамарказ банақшагирӣ ва иҷро кунанд.

Системаҳои амалиётии ба Unix монанд пайдоиши худро ба Версияи 7 Unix, ки дар солҳои 70-уми асри гузашта дар Bell Labs, аз ҷумла аз ҷониби Кен Томпсони машҳур таҳия шудааст, пайгирӣ мекунанд. Версияи 7 Unix инчунин cron-ро дар бар гирифт, ки хидмат барои мунтазам иҷро кардани вазифаҳои суперкорбарӣ мебошад.

Cron маъмулии муосир як барномаи оддӣ аст, аммо алгоритми амалии версияи аслӣ боз ҳам соддатар буд: хидмат дар як дақиқа як маротиба бедор шуд, ҷадвалро бо супоришҳо аз як файл (/etc/lib/crontab) хонд ва барои он вазифаҳоеро, ки бояд дар айни замон иҷро мешуданд, superuser кунед.

Баъдан, версияҳои такмилёфтаи хидмати оддӣ ва муфид бо ҳама системаҳои амалиётии ба Unix монанд таъмин карда шуданд.

Тавсифи умумии формати crontab ва принсипҳои асосии кори утилита дар соли 1992 ба стандарти асосии системаҳои оператсионии Unix монанд - POSIX дохил карда шуданд ва ҳамин тавр cron аз стандарти де-факто ба стандарти де-юре табдил ёфт.

Дар соли 1987, Пол Викси аз корбарони Unix дар бораи хоҳишҳои онҳо дар бораи cron пурсиш карда, версияи дигари демонро нашр кард, ки баъзе мушкилоти cron анъанавиро ислоҳ ва синтаксиси файлҳои ҷадвалро васеъ кард.

Бо версияи сеюми Vixie cron ба талаботи POSIX ҷавобгӯ буд, илова бар ин, барнома дорои литсензияи либералӣ буд, ё дурусттараш, умуман иҷозатнома вуҷуд надошт, ба истиснои хоҳишҳо дар README: муаллиф кафолат намедиҳад, номи муаллиф нест кардан мумкин нест ва барномаро танҳо дар якҷоягӣ бо рамзи сарчашма фурӯхтан мумкин аст. Ин талаботҳо бо принсипҳои нармафзори озод, ки дар он солҳо маъруфият пайдо мекарданд, мувофиқ буданд, аз ин рӯ баъзе дистрибюсияҳои асосии Linux, ки дар аввали солҳои 90-ум пайдо шуданд, Vixie cron-ро ҳамчун системаи худ гирифтанд ва ҳоло ҳам онро таҳия мекунанд.

Махсусан, Red Hat ва SUSE як штангаи Vixie cron - cronie-ро таҳия мекунанд ва Debian ва Ubuntu нашри аслии Vixie cronро бо часпакҳои зиёд истифода мебаранд.

Биёед аввал бо утилитаи корбар crontab, ки дар POSIX тавсиф шудааст, шинос шавем, баъд аз он мо васеъшавии синтаксиси дар Vixie cron пешниҳодшуда ва истифодаи вариантҳои Vixie cron дар дистрибюторҳои маъмули Linuxро дида мебароем. Ва ниҳоят, гелос дар торт таҳлили дастгоҳи демони крон мебошад.

Crontab POSIX

Агар 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 Vixie cron 3.0pl1 мебошад, ки дар рӯйхати почтаи электронии comp.sources.unix дар соли 1992 ҷорӣ карда шудааст. Мо хусусиятҳои асосии ин версияро муфассалтар баррасӣ хоҳем кард.

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 идора карда мешаванд, ки дар он шумо танҳо номи корбарро дар сатри алоҳида ворид кардан лозим аст.

Синтаксиси васеъшуда

Дар муқоиса бо crontab POSIX, ҳалли Пол Викси дорои якчанд тағйироти хеле муфид ба синтаксиси ҷадвалҳои вазифаҳои утилита мебошад.

Синтаксиси нави ҷадвал дастрас шуд: масалан, шумо метавонед рӯзҳои ҳафта ё моҳҳоро бо ном муайян кунед (Душанбе, Сешанбе ва ғайра):

# Запускается ежеминутно по понедельникам и вторникам в январе
* * * 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 барои иҷрои вазифа истифода мешаванд. Ин аст он чизест, ки истифодаи bash ба ҷои sh стандартӣ барои иҷрои вазифаҳои фармоишӣ метавонад чунин бошад:

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

Дар ниҳоят, ҳама тағирёбандаҳои муҳити дар ҷадвал муайяншуда (аз ҷониби cron истифода мешаванд ё раванд лозим аст) ба вазифаи иҷрошаванда интиқол дода мешаванд.

Барои таҳрири файлҳо, crontab муҳаррири дар тағирёбандаи муҳити VISUAL ё EDITOR муайяншударо истифода мебарад. Агар муҳите, ки crontab иҷро шудааст, ин тағирёбандаҳоро муайян накунад, пас "/usr/ucb/vi" истифода мешавад (ucb эҳтимолан Донишгоҳи Калифорния, Беркли бошад).

cron дар Debian ва Ubuntu

Таҳиягарони 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 мувофиқ аст тилда, бидуни хондани ягон конфигуратсия (дар реҷаи ғайри интерактивӣ) оғоз ёфт.

Худи Cron дар версияҳои охирини Debian тавассути systemd оғоз карда мешавад ва конфигуратсияи оғозро дар /lib/systemd/system/cron.service дидан мумкин аст. Дар конфигуратсияи хидмат ҳеҷ чизи махсус вуҷуд надорад; ҳама гуна идоракунии дақиқтари вазифаҳоро тавассути тағирёбандаҳои муҳити зист, ки мустақиман дар crontab-и ҳар як корбар эълон шудаанд, иҷро кардан мумкин аст.

cronie дар RedHat, Fedora ва CentOS

крони - версияи Vixie cron 4.1. Мисли дар Debian, синтаксис тағйир наёфтааст, аммо дастгирии PAM ва SELinux, кор дар кластер, пайгирии файлҳо бо истифода аз inotify ва дигар хусусиятҳо илова карда шудааст.

Конфигуратсияи пешфарз дар ҷойҳои муқаррарӣ ҷойгир аст: ҷадвали система дар /etc/crontab, бастаҳо ҷадвалҳои худро дар /etc/cron.d ҷойгир мекунанд, ҷадвалҳои корбар ба /var/spool/cron/crontabs дохил мешаванд.

Демон зери назорати systemd кор мекунад, конфигуратсияи хадамот /lib/systemd/system/crond.service аст.

Дар тақсимоти ба монанди Red Hat, /bin/sh ҳангоми оғозёбӣ ба таври нобаёнӣ истифода мешавад, ки ин bash стандартӣ мебошад. Бояд қайд кард, ки ҳангоми иҷрои корҳои cron тавассути /bin/sh, shell bash дар реҷаи мувофиқи POSIX оғоз мешавад ва ягон конфигуратсияи иловагиро намехонад, ки дар реҷаи ғайри интерактивӣ кор мекунад.

cronie дар SLES ва openSUSE

Тақсимоти олмонии SLES ва ҳосилаи он openSUSE ҳамон cronie-ро истифода мебаранд. Демон дар ин ҷо инчунин дар зери systemd оғоз карда мешавад, конфигуратсияи хидмат дар /usr/lib/systemd/system/cron.service ҷойгир аст. Танзимот: /etc/crontab, /etc/cron.d, /var/spool/cron/tabs. /bin/sh ҳамон bash аст, ки дар реҷаи ғайри интерактивӣ ба POSIX кор мекунад.

Дастгоҳи Vixie cron

Наслҳои муосири cron дар муқоиса бо Vixie cron ба таври куллӣ тағир наёфтаанд, аммо ба ҳар ҳол хусусиятҳои наверо ба даст оварданд, ки барои фаҳмидани принсипҳои барнома талаб карда намешаванд. Бисёре аз ин васеъкуниҳо бад тарҳрезӣ шудаанд ва кодро иштибоҳ мекунанд. Рамзи аслии cron аз ҷониби Пол Викси хондан хушнудист.

Аз ин рӯ, ман тасмим гирифтам, ки дастгоҳи cron-ро бо истифода аз мисоли барномаи cron, ки барои ҳарду шохаҳои рушд маъмуланд - Vixie cron 3.0pl1 таҳлил кунам. Ман мисолҳоро бо бартараф кардани ifdefs, ки хонданро душвор мегардонанд ва тафсилоти хурдро сарфи назар мекунам, содда мекунам.

Кори девро метавон ба якчанд марҳила тақсим кард:

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

Сипас, раванд "демонизатсия" мешавад: он нусхаи кӯдаки равандро тавассути занги fork ва сессияи нав дар раванди кӯдак (занг 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 тасдиқ мекунад, ки корбаре, ки ба номи файли ҷадвал мувофиқат мекунад, мавҷудияти корбариро тасдиқ мекунад (агар он superuser набошад) ва сипас 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);

Давраи асосӣ бо рӯйхати ҷории вазифаҳо кор мекунад.

Давраи асосӣ

Cron аслӣ аз Version 7 Unix хеле содда кор мекард: он конфигуратсияро дар як давр дубора хонд, супоришҳои дақиқаи ҷорӣро ҳамчун суперкорбар оғоз кард ва то оғози дақиқаи оянда хобид. Ин равиши оддӣ дар мошинҳои кӯҳна захираҳои зиёдро талаб мекард.

Дар 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-ро дӯст доред, аз барномаҳои содда истифода баред ва хондани манаро барои платформаи худ фаромӯш накунед!

Манбаъ: will.com

Илова Эзоҳ