Il-klassika kiteb li sigħat kuntenti ma jarawx. F'dawk iż-żminijiet selvaġġi la kien hemm programmaturi u lanqas Unix, iżda llum il-programmaturi jafu żgur: cron se jżomm kont tal-ħin minflokhom.
L-utilitajiet tal-linja tal-kmand huma kemm dgħjufija kif ukoll xogħol għalija. sed, awk, wc, cut u programmi qodma oħra huma mmexxija minn skripts fuq is-servers tagħna kuljum. Ħafna minnhom huma ddisinjati bħala kompiti għal cron, scheduler oriġinarjament mis-snin 70.
Għal żmien twil użajt il-cron b'mod superfiċjali, mingħajr ma dħalt fid-dettalji, iżda xi darba, meta ltqajt ma' żball meta nmexxi script, iddeċidejt li nħares sewwa. Hekk deher dan l-artiklu, waqt li ktibtu sirt familjari mal-POSIX crontab, l-għażliet ewlenin tal-cron fid-distribuzzjonijiet popolari tal-Linux u l-istruttura ta’ xi wħud minnhom.
Qed tuża Linux u tmexxi kompiti cron? Inti interessat fl-arkitettura tal-applikazzjoni tas-sistema f'Unix? Imbagħad aħna qed fi triqitna!
L-eżekuzzjoni perjodika tal-programmi tal-utent jew tas-sistema hija ħtieġa ovvja fis-sistemi operattivi kollha. Għalhekk, il-programmaturi rrealizzaw il-ħtieġa għal servizzi li jippermettulhom jippjanaw u jeżegwixxu kompiti ċentralment żmien twil ilu.
Is-sistemi operattivi bħal Unix jittraċċaw l-oriġini tagħhom lura għall-Verżjoni 7 Unix, żviluppata fis-snin 70 tas-seklu li għadda fil-Bell Labs, inkluż mill-famuż Ken Thompson. Verżjoni 7 Unix inkludiet ukoll cron, servizz għat-tmexxija regolari tal-kompiti tas-superuser.
Cron modern tipiku huwa programm sempliċi, iżda l-algoritmu operattiv tal-verżjoni oriġinali kien saħansitra aktar sempliċi: is-servizz qam darba fil-minuta, aqra tabella b'kompiti minn fajl wieħed (/etc/lib/crontab) u wettaq għall- superuser dawk il-kompiti li kellhom jitwettqu fil-mument attwali.
Sussegwentement, verżjonijiet imtejba tas-servizz sempliċi u utli ġew fornuti bis-sistemi operattivi kollha bħal Unix.
Deskrizzjonijiet ġeneralizzati tal-format crontab u l-prinċipji bażiċi tal-operat tal-utilità ġew inklużi fl-istandard ewlieni ta 'sistemi operattivi Unix-like - POSIX - fl-1992, u għalhekk cron minn standard de facto sar standard de jure.
Fl-1987, Paul Vixie, wara li stħarreġ lill-utenti Unix dwar ix-xewqat tagħhom għal cron, ħareġ verżjoni oħra tad-daemon li kkoreġiet xi wħud mill-problemi ta 'cron tradizzjonali u espandiet is-sintassi tal-fajls tat-tabella.
Mit-tielet verżjoni ta 'Vixie cron bdiet tissodisfa r-rekwiżiti POSIX, barra minn hekk, il-programm kellu liċenzja liberali, jew aħjar ma kien hemm l-ebda liċenzja, ħlief għax-xewqat fil-README: l-awtur ma jagħtix garanziji, l-isem tal-awtur ma jistax jitħassar, u l-programm jista 'jinbiegħ biss flimkien mal-kodiċi tas-sors. Dawn ir-rekwiżiti rriżultaw li huma kompatibbli mal-prinċipji ta’ softwer b’xejn li kien qed jikseb popolarità f’dawk is-snin, għalhekk xi wħud mid-distribuzzjonijiet ewlenin tal-Linux li dehru fil-bidu tas-snin 90 ħadu lil Vixie cron bħala waħda tas-sistema tagħhom u għadhom qed jiżviluppawha llum.
B'mod partikolari, Red Hat u SUSE jiżviluppaw furketta ta 'Vixie cron - cronie, u Debian u Ubuntu jużaw l-edizzjoni oriġinali ta' Vixie cron b'ħafna garżi.
Ejja l-ewwel niffamiljarizzaw ruħhom mal-crontab tal-utilità tal-utent deskritta f'POSIX, u wara se nħarsu lejn l-estensjonijiet tas-sintassi pprovduti f'Vixie cron u l-użu ta 'varjazzjonijiet ta' Vixie cron fid-distribuzzjonijiet popolari tal-Linux. U fl-aħħarnett, iċ-ċirasa fuq il-kejk hija l-analiżi tal-apparat cron daemon.
POSIX crontab
Jekk il-cron oriġinali dejjem ħadem għas-superuser, l-iskedaturi moderni ħafna drabi jittrattaw ħidmiet ta 'utenti ordinarji, li huwa aktar sigur u konvenjenti.
Crons huma fornuti bħala sett ta 'żewġ programmi: id-daemon cron li qed jaħdem kontinwament u l-utilità crontab disponibbli għall-utenti. Dan tal-aħħar jippermettilek teditja tabelli tal-kompiti speċifiċi għal kull utent fis-sistema, filwaqt li d-daemon iniedi kompiti minn tabelli tal-utent u tas-sistema.
В Standard POSIX l-imġieba tad-daemon mhix deskritta bl-ebda mod u l-programm tal-utent biss huwa formalizzat crontab. L-eżistenza ta 'mekkaniżmi għat-tnedija tal-kompiti tal-utent hija, ovvjament, implikata, iżda mhux deskritta fid-dettall.
Billi ċċempel l-utilità tal-crontab, tista 'tagħmel erba' affarijiet: editja t-tabella tal-kompitu tal-utent fl-editur, tagħbija t-tabella minn fajl, turi t-tabella tal-kompitu attwali, u ċara t-tabella tal-kompiti. Eżempji ta' kif taħdem l-utilità crontab:
crontab -e # редактировать таблицу задач
crontab -l # показать таблицу задач
crontab -r # удалить таблицу задач
crontab path/to/file.crontab # загрузить таблицу задач из файла
Meta tissejjaħ crontab -e se jintuża l-editur speċifikat fil-varjabbli ambjentali standard EDITOR.
Il-kompiti nfushom huma deskritti fil-format li ġej:
# строки-комментарии игнорируются
#
# задача, выполняемая ежеминутно
* * * * * /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
L-ewwel ħames oqsma tar-rekords: minuti [1..60], sigħat [0..23], ġranet tax-xahar [1..31], xhur [1..12], ġranet tal-ġimgħa [0. .6], fejn 0 huwa l-Ħadd. L-aħħar, is-sitt, qasam huwa linja li se tiġi esegwita mill-interpretu tal-kmand standard.
Fl-ewwel ħames oqsma, il-valuri jistgħu jiġu elenkati separati b'virgoli:
# задача, выполняемая в первую и десятую минуты каждого часа
1,10 * * * * /path/to/exec -a -b -c
Jew b'sing:
# задача, выполняемая в каждую из первых десяти минут каждого часа
0-9 * * * * /path/to/exec -a -b -c
L-aċċess tal-utent għall-iskedar tal-kompiti huwa regolat f'POSIX mill-fajls cron.allow u cron.deny, li jelenkaw utenti b'aċċess għal crontab u utenti mingħajr aċċess għall-programm, rispettivament. L-istandard ma jirregola l-post ta 'dawn il-fajls bl-ebda mod.
Skont l-istandard, mill-inqas erba' varjabbli ambjentali għandhom jiġu mgħoddija lill-programmi mnedija:
HOME - direttorju tad-dar tal-utent.
LOGNAME — login tal-utent.
PATH hija t-triq fejn tista 'ssib utilitajiet tas-sistema standard.
SHELL — mogħdija għall-interpretu tal-kmand użat.
Notevolment, POSIX ma tgħid xejn dwar minn fejn jiġu l-valuri għal dawn il-varjabbli.
Best seller - Vixie cron 3.0pl1
L-antenat komuni tal-varjanti cron popolari huwa Vixie cron 3.0pl1, introdott fil-lista tal-posta comp.sources.unix fl-1992. Aħna se nikkunsidraw il-karatteristiċi ewlenin ta 'din il-verżjoni f'aktar dettall.
Vixie cron jiġi f'żewġ programmi (cron u crontab). Bħas-soltu, id-daemon huwa responsabbli għall-qari u t-tmexxija tal-kompiti mit-tabelli tal-kompiti tas-sistema u t-tabelli tal-kompiti tal-utent individwali, u l-utilità crontab hija responsabbli għall-editjar tat-tabelli tal-utent.
Tabella tal-kompiti u fajls tal-konfigurazzjoni
It-tabella tal-kompitu tas-superuser tinsab f'/etc/crontab. Is-sintassi tat-tabella tas-sistema tikkorrispondi mas-sintassi ta' Vixie cron, bl-eċċezzjoni li s-sitt kolonna fiha tindika l-isem tal-utent li f'ismu jitnieda l-kompitu:
It-tabelli tal-kompiti tal-utent regolari jinsabu f'/var/cron/tabs/username u jużaw l-istess sintassi. Meta tħaddem l-utilità crontab bħala utent, dawn huma l-fajls li huma editjati.
Il-listi ta' utenti b'aċċess għal crontab huma ġestiti fil-fajls /var/cron/allow u /var/cron/deny, fejn għandek bżonn biss li ddaħħal l-isem tal-utent f'linja separata.
Sintassi estiża
Meta mqabbel ma 'POSIX crontab, is-soluzzjoni ta' Paul Vixey fiha diversi modifiki utli ħafna għas-sintassi tat-tabelli tal-kompiti tal-utilità.
Sintassi ta' tabella ġdida saret disponibbli: pereżempju, tista' tispeċifika ġranet tal-ġimgħa jew xhur b'isem (Tne, Tlieta, eċċ):
# Запускается ежеминутно по понедельникам и вторникам в январе
* * * Jan Mon,Tue /path/to/exec
Tista' tispeċifika l-pass li permezz tiegħu jiġu varati l-kompiti:
# Запускается с шагом в две минуты
*/2 * * * Mon,Tue /path/to/exec
Passi u intervalli jistgħu jitħalltu:
# Запускается с шагом в две минуты в первых десять минут каждого часа
0-10/2 * * * * /path/to/exec
Huma appoġġjati alternattivi intuwittivi għas-sintassi tas-soltu (reboot, kull sena, kull sena, kull xahar, kull ġimgħa, kuljum, nofs il-lejl, kull siegħa):
# Запускается после перезагрузки системы
@reboot /exec/on/reboot
# Запускается раз в день
@daily /exec/daily
# Запускается раз в час
@hourly /exec/daily
Il-varjabbli ambjentali USER, LOGNAME u HOME mhumiex sempliċement ipprovduti mid-daemon, iżda jittieħdu minn fajl passwd. Il-varjabbli PATH hija ssettjata għal "/usr/bin:/bin" u l-varjabbli SHELL hija ssettjata għal "/bin/sh". Il-valuri tal-varjabbli kollha ħlief LOGNAME jistgħu jinbidlu fit-tabelli tal-utenti.
Xi varjabbli ambjentali (l-aktar SHELL u HOME) jintużaw minn cron innifsu biex imexxi l-kompitu. Hawn kif tista' tidher l-użu ta' bash minflok sh standard biex imexxu kompiti tad-dwana:
SHELL=/bin/bash
HOME=/tmp/
# exec будет запущен bash-ем в /tmp/
* * * * * /path/to/exec
Fl-aħħar mill-aħħar, il-varjabbli ambjentali kollha definiti fit-tabella (użati minn cron jew meħtieġa mill-proċess) se jiġu mgħoddija lill-kompitu li qed jaħdem.
Biex teditja l-fajls, crontab juża l-editur speċifikat fil-varjabbli tal-ambjent VISUAL jew EDITOR. Jekk l-ambjent fejn tmexxi crontab ma jkollux dawn il-varjabbli definiti, allura tintuża "/usr/ucb/vi" (ucb hija probabbilment l-Università ta' Kalifornja, Berkeley).
cron fuq Debian u Ubuntu
L-iżviluppaturi ta 'Debian u distribuzzjonijiet derivattivi ħarġu verżjoni modifikata ħafna Vixie cron verżjoni 3.0pl1. M'hemm l-ebda differenzi fis-sintassi tal-fajls tat-tabella għall-utenti huwa l-istess Vixie cron; L-akbar Karatteristika ġdida: Appoġġ sistema, SELinux и PAM.
Tibdiliet inqas notevoli, iżda tanġibbli jinkludu l-post tal-fajls tal-konfigurazzjoni u t-tabelli tal-kompiti.
It-tabelli tal-utenti f'Debian jinsabu fid-direttorju /var/spool/cron/crontabs, it-tabella tas-sistema għadha hemm - f'/etc/crontab. It-tabelli tal-kompiti speċifiċi għall-pakkett Debian jitqiegħdu f'/etc/cron.d, minn fejn id-daemon cron jaqrahom awtomatikament. Il-kontroll tal-aċċess tal-utent huwa kkontrollat mill-fajls /etc/cron.allow u /etc/cron.deny.
Il-qoxra default għadha /bin/sh, li f'Debian hija qoxra żgħira konformi ma' POSIX sing, imnedija mingħajr ma taqra l-ebda konfigurazzjoni (f'modalità mhux interattiva).
Cron innifsu fl-aħħar verżjonijiet ta 'Debian huwa mniedi permezz ta' systemd, u l-konfigurazzjoni tat-tnedija tista 'tara f'/lib/systemd/system/cron.service. M'hemm xejn speċjali fil-konfigurazzjoni tas-servizz; kwalunkwe ġestjoni tal-kompiti aktar sottili tista 'ssir permezz ta' varjabbli ambjentali ddikjarati direttament fil-crontab ta 'kull utent.
cronie fuq RedHat, Fedora u CentOS
crony — furketta ta' Vixie cron verżjoni 4.1. Bħal f'Debian, is-sintassi ma nbidlitx, iżda ġie miżjud appoġġ għal PAM u SELinux, li jaħdmu fi cluster, li jsegwu fajls bl-użu ta' inotify u karatteristiċi oħra.
Il-konfigurazzjoni default tinsab fil-postijiet tas-soltu: it-tabella tas-sistema tinsab f'/etc/crontab, il-pakketti jpoġġu t-tabelli tagħhom f'/etc/cron.d, it-tabelli tal-utenti jmorru f'/var/spool/cron/crontabs.
Id-daemon jaħdem taħt kontroll systemd, il-konfigurazzjoni tas-servizz hija /lib/systemd/system/crond.service.
Fuq distribuzzjonijiet bħal Red Hat, /bin/sh jintuża awtomatikament fl-istartjar, li huwa l-bash standard. Għandu jiġi nnutat li meta tħaddem impjiegi cron permezz ta '/bin/sh, il-qoxra tal-bash tibda fil-modalità konformi ma' POSIX u ma taqra l-ebda konfigurazzjoni addizzjonali, taħdem f'modalità mhux interattiva.
cronie fl-SLES u openSUSE
Id-distribuzzjoni Ġermaniża SLES u d-derivattiv tagħha openSUSE jużaw l-istess cronie. Id-daemon hawnhekk huwa mniedi wkoll taħt systemd, il-konfigurazzjoni tas-servizz tinsab f'/usr/lib/systemd/system/cron.service. Konfigurazzjoni: /etc/crontab, /etc/cron.d, /var/spool/cron/tabs. /bin/sh huwa l-istess bash li jaħdem fil-modalità mhux interattiva konformi mal-POSIX.
Apparat cron Vixie
Dixxendenti moderni ta 'cron ma nbidlux radikalment meta mqabbla ma' Vixie cron, iżda xorta kisbu karatteristiċi ġodda li mhumiex meħtieġa biex jifhmu l-prinċipji tal-programm. Ħafna minn dawn l-estensjonijiet huma ddisinjati ħażin u jħawdu l-kodiċi. Il-kodiċi tas-sors cron oriġinali minn Paul Vixey huwa ta 'pjaċir li taqra.
Għalhekk, iddeċidejt li tanalizza l-apparat cron billi tuża l-eżempju ta 'programm cron komuni għaż-żewġ fergħat tal-iżvilupp - Vixie cron 3.0pl1. Se nissimplifika l-eżempji billi nneħħi l-ifdefs li jikkomplikaw il-qari u nħalli barra dettalji minuri.
Ix-xogħol tad-dimonju jista 'jinqasam f'diversi stadji:
Inizjalizzazzjoni tal-programm.
Il-ġbir u l-aġġornament tal-lista tal-kompiti li għandhom imexxu.
Cron loop prinċipali taħdem.
Ibda kompitu.
Ejja nħarsu lejhom fl-ordni.
Inizjalizzazzjoni
Meta jinbeda, wara li jiċċekkja l-argumenti tal-proċess, cron jinstalla l-immaniġġjar tas-sinjali SIGCHLD u SIGHUP. L-ewwel wieħed jagħmel dħul fil-log dwar it-terminazzjoni tal-proċess tat-tfal, it-tieni wieħed jagħlaq id-deskrittur tal-fajl tal-fajl log:
Il-cron daemon dejjem jaħdem waħdu fis-sistema, biss bħala superuser u mid-direttorju cron prinċipali. Is-sejħiet li ġejjin joħolqu fajl lock bil-PID tal-proċess daemon, kun żgur li l-utent huwa korrett u ibdel id-direttorju attwali għal dak prinċipali:
Il-mogħdija default hija stabbilita, li se tintuża meta jibdew il-proċessi:
setenv("PATH", _PATH_DEFPATH, 1);
Imbagħad il-proċess huwa "demonizzat": joħloq kopja tifel tal-proċess billi ssejjaħ fork u sessjoni ġdida fil-proċess tifel (sejħa setsid). Il-proċess ġenitur m'għadux meħtieġ, u joħroġ:
switch (fork()) {
case -1:
/* критическая ошибка и завершение работы */
exit(0);
break;
case 0:
/* дочерний процесс */
(void) setsid();
break;
default:
/* родительский процесс завершает работу */
_exit(0);
}
It-tmiem tal-proċess ġenitur jirrilaxxa l-lock fuq il-fajl tal-lock. Barra minn hekk, huwa meħtieġ li taġġorna l-PID fil-fajl lit-tifel. Wara dan, id-database tal-kompiti timtela:
Imbagħad cron jimxi fuq iċ-ċiklu tax-xogħol prinċipali. Iżda qabel dan, ta 'min jagħti ħarsa lejn it-tagħbija tal-lista tal-kompiti.
Il-ġbir u l-aġġornament tal-lista tal-kompiti
Il-funzjoni load_database hija responsabbli għat-tagħbija tal-lista tal-kompiti. Jiċċekkja s-sistema prinċipali crontab u d-direttorju bil-fajls tal-utent. Jekk il-fajls u d-direttorju ma nbidlux, il-lista tal-kompiti ma terġax tinqara. Inkella, tibda tifforma lista ġdida ta 'kompiti.
Tagħbija ta' fajl tas-sistema b'ismijiet speċjali ta' fajls u tabelli:
/* если файл системной таблицы изменился, перечитываем */
if (syscron_stat.st_mtime) {
process_crontab("root", "*system*",
SYSCRONTAB, &syscron_stat,
&new_db, old_db);
}
Tagħbija tat-tabelli tal-utenti f'linja:
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);
}
Wara dan id-database l-antika tinbidel b'waħda ġdida.
Fl-eżempji ta 'hawn fuq, is-sejħa tal-funzjoni process_crontab tivverifika li jeżisti utent li jaqbel mal-isem tal-fajl tat-tabella (sakemm ma jkunx superuser) u mbagħad isejjaħ load_user. Dan tal-aħħar diġà jaqra l-fajl innifsu linja b'linja:
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;
}
}
Hawnhekk, jew il-varjabbli tal-ambjent hija ssettjata (linji tal-forma VAR=value) bl-użu tal-funzjonijiet load_env / env_set, jew id-deskrizzjoni tal-kompitu tinqara (* * * * * /path/to/exec) bl-użu tal-funzjoni load_entry.
L-entità tad-dħul li load_entry tirritorna hija l-kompitu tagħna, li titqiegħed fil-lista ġenerali tal-kompiti. Il-funzjoni nnifisha twettaq parsing verbose tal-format tal-ħin, iżda aħna aktar interessati fil-formazzjoni ta 'varjabbli ambjentali u parametri tat-tnedija tal-kompiti:
/* пользователь и группа для запуска задачи берутся из 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);
Il-linja prinċipali taħdem mal-lista attwali tal-kompiti.
Loop prinċipali
Il-cron oriġinali mill-Verżjoni 7 Unix ħadem pjuttost sempliċi: reġa' aqra l-konfigurazzjoni f'linja, nieda l-kompiti tal-minuta attwali bħala superuser, u raqad sal-bidu tal-minuta li jmiss. Dan l-approċċ sempliċi fuq magni anzjani kien jeħtieġ wisq riżorsi.
Ġiet proposta verżjoni alternattiva f'SysV, li fiha d-daemon mar jorqod jew sal-eqreb minuta li għaliha ġie definit il-kompitu, jew għal 30 minuta. Inqas riżorsi ġew ikkunsmati għall-qari mill-ġdid tal-konfigurazzjoni u l-iċċekkjar tal-kompiti f'dan il-mod, iżda l-aġġornament malajr tal-lista tal-kompiti sar inkonvenjenti.
Vixie cron irritorna biex jiċċekkja l-listi tal-kompiti darba fil-minuta, fortunatament sa tmiem is-snin 80 kien hemm ħafna aktar riżorsi fuq magni standard 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;
}
Il-funzjoni cron_sleep hija direttament involuta fl-eżekuzzjoni tal-kompiti, issejjaħ il-funzjonijiet job_runqueue (enumera u mexxi l-kompiti) u do_command (mexxi kull kompitu individwali). L-aħħar funzjoni ta 'min jeżamina f'aktar dettall.
Tmexxi kompitu
Il-funzjoni do_command hija eżegwita fi stil Unix tajjeb, jiġifieri, tagħmel furketta biex twettaq il-kompitu b'mod asinkroniku. Il-proċess ġenitur ikompli jniedi l-kompiti, il-proċess tat-tfal jipprepara l-proċess tal-kompitu:
switch (fork()) {
case -1:
/*не смогли выполнить fork */
break;
case 0:
/* дочерний процесс: на всякий случай еще раз пробуем захватить главный лок */
acquire_daemonlock(1);
/* переходим к формированию процесса задачи */
child_process(e, u);
/* по завершению дочерний процесс заканчивает работу */
_exit(OK_EXIT);
break;
default:
/* родительский процесс продолжает работу */
break;
}
Hemm ħafna loġika f'child_process: jaċċetta output standard u flussi ta' żbalji, imbagħad jibgħathom lill-posta (jekk il-varjabbli tal-ambjent MAILTO hija speċifikata fit-tabella tal-kompitu), u, finalment, tistenna l-proċess ewlieni tal-kompitu biex kompluta.
Il-proċess tal-kompitu huwa ffurmat minn furketta oħra:
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;
}
Bażikament dak kollu huwa cron. Ħallat barra xi dettalji interessanti, pereżempju, kont ta 'utenti remoti, iżda ddeskriviejt il-ħaġa prinċipali.
Wara kelma
Cron huwa programm sorprendentement sempliċi u utli, magħmul fl-aqwa tradizzjonijiet tad-dinja Unix. Hija ma tagħmel xejn żejjed, iżda issa ilha tagħmel xogħolha mill-isbaħ għal bosta deċennji. Li ngħaddi l-kodiċi għall-verżjoni li tiġi ma 'Ubuntu ma ħaditx aktar minn siegħa, u ħadt gost ħafna! Nispera li stajt naqsamha miegħek.
Ma nafx dwarek, imma jien ftit imdejjaq nirrealizza li l-programmazzjoni moderna, bit-tendenza tagħha li tikkomplika żżejjed u wisq astratta, ilha ma twassalx għal sempliċità bħal din.
Hemm ħafna alternattivi moderni għal cron: systemd-timers jippermettulek torganizza sistemi kumplessi b'dipendenzi, fcron jippermettilek tirregola b'mod aktar flessibbli l-konsum tar-riżorsi skont il-kompiti. Imma personalment, l-aktar sempliċi crontab kien dejjem biżżejjed għalija.
Fil-qosor, ħobb Unix, uża programmi sempliċi u tinsiex taqra l-mana għall-pjattaforma tiegħek!