
Klasiku shkruante se orët e lumtura nuk shikojnë. Në ato kohëra të egra nuk kishte as programues dhe as Unix, por sot programuesit e dinë me siguri: Cron do të mbajë gjurmët e kohës në vend të tyre.
Shërbimet e linjës së komandës janë një dobësi dhe një punë e përditshme për mua. sed, awk, wc, cut dhe programe të tjera të vjetra drejtohen nga skriptet në serverët tanë çdo ditë. Shumë prej tyre janë krijuar si detyra për cron, një planifikues fillimisht nga vitet '70.
E përdora cron sipërfaqësisht për një kohë të gjatë, pa u thelluar në detaje, por një ditë, kur hasa një gabim gjatë ekzekutimit të një skripti, vendosa ta shqyrtoja më nga afër. Kështu lindi ky artikull dhe, ndërsa e shkruaja, u njoha me POSIX crontab dhe opsionet kryesore të cron në shpërndarjet popullore. Linux dhe dizajni i disa prej tyre.
A po përdorni Linux dhe të ekzekutoni punë cron? A jeni të interesuar në arkitekturën e aplikacioneve të sistemit Unix? Atëherë jemi në të njëjtën linjë!
Përmbajtje
Origjina e specieve
Ekzekutimi periodik i programeve të përdoruesve ose të sistemit është një domosdoshmëri e dukshme në të gjitha sistemet operative. Prandaj, programuesit e kuptuan nevojën për shërbime që u lejojnë atyre të planifikojnë dhe ekzekutojnë detyrat në mënyrë qendrore shumë kohë më parë.
Sistemet operative të ngjashme me Unix-in e gjurmojnë origjinën e tyre që nga Versioni 7 Unix, i zhvilluar në vitet 70 të shekullit të kaluar në Bell Labs, përfshirë nga i famshëm Ken Thompson. Versioni 7 Unix përfshinte gjithashtu cron, një shërbim për ekzekutimin e rregullt të detyrave të superpërdoruesve.
Një cron tipik modern është një program i thjeshtë, por algoritmi i funksionimit të versionit origjinal ishte edhe më i thjeshtë: shërbimi zgjohej një herë në minutë, lexonte një tabelë me detyra nga një skedar i vetëm (/etc/lib/crontab) dhe kryente për superpërdorues ato detyra që duhet të ishin kryer në momentin aktual .
Më pas, versionet e përmirësuara të shërbimit të thjeshtë dhe të dobishëm u furnizuan me të gjitha sistemet operative të ngjashme me Unix.
Përshkrimet e përgjithësuara të formatit crontab dhe parimet bazë të funksionimit të shërbimit u përfshinë në standardin kryesor të sistemeve operative të ngjashme me Unix - POSIX - në 1992, dhe kështu cron nga një standard de facto u bë një standard de jure.
Në vitin 1987, Paul Vixie, pasi kishte anketuar përdoruesit e Unix-it për dëshirat e tyre për cron, lëshoi një version tjetër të daemon-it që korrigjonte disa nga problemet e cron-it tradicional dhe zgjeroi sintaksën e skedarëve të tabelës.
Deri në versionin e tretë të Vixie, cron ishte bërë i pajtueshëm me POSIX dhe programi kishte një licencë lejuese - ose më saktë, asnjë licencë, përveç README: autori nuk ofron garanci, emri i autorit nuk mund të hiqet dhe programi mund të shitet vetëm me kodin burimor. Këto kërkesa rezultuan të pajtueshme me parimet e softuerit të lirë, i cili po fitonte popullaritet në atë kohë, dhe për këtë arsye disa shpërndarje kryesore që dolën në fillim të viteve 90. Linux Ata e morën Vixie cron si një cron sistemi dhe ende po e zhvillojnë atë.
Në veçanti, Red Hat dhe SUSE po zhvillojnë një degëzim të Vixie cron, cronie dhe Debian и Ubuntu Përdorni edicionin origjinal të Vixie cron me shumë patch-e.
Le të njihemi së pari me programin e përdoruesit POSIX crontab, pas së cilës do të shqyrtojmë zgjerimet sintaksore të paraqitura në Vixie cron dhe përdorimin e variacioneve të Vixie cron në shpërndarjet popullore. LinuxDhe së fundmi, qershia mbi tortë - një analizë e strukturës së demonit cron.
Krontab POSIX
Nëse cron origjinal ka punuar gjithmonë për superpërdoruesin, programuesit modernë shpesh merren me detyrat e përdoruesve të zakonshëm, gjë që është më e sigurt dhe më e përshtatshme.
Crons ofrohen si një grup prej dy programesh: cron daemon që funksionon vazhdimisht dhe programi crontab i disponueshëm për përdoruesit. Kjo e fundit ju lejon të redaktoni tabelat e detyrave specifike për secilin përdorues në sistem, ndërsa daemon lëshon detyra nga tabelat e përdoruesve dhe të sistemit.
В sjellja e demonit nuk përshkruhet në asnjë mënyrë dhe vetëm programi i përdoruesit është i zyrtarizuar . Ekzistenca e mekanizmave për nisjen e detyrave të përdoruesit, natyrisht, nënkuptohet, por nuk përshkruhet në detaje.
Duke telefonuar programin crontab, mund të bëni katër gjëra: modifikoni tabelën e detyrave të përdoruesit në redaktues, ngarkoni tabelën nga një skedar, tregoni tabelën aktuale të detyrave dhe pastroni tabelën e detyrave. Shembuj se si funksionon mjeti crontab:
crontab -e # редактировать таблицу задач
crontab -l # показать таблицу задач
crontab -r # удалить таблицу задач
crontab path/to/file.crontab # загрузить таблицу задач из файлаKur thirret crontab -e do të përdoret redaktori i specifikuar në variablin standard të mjedisit EDITOR.
Vetë detyrat përshkruhen në formatin e mëposhtëm:
# строки-комментарии игнорируются
#
# задача, выполняемая ежеминутно
* * * * * /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.logPesë fushat e para të regjistrimeve: minuta [1..60], orë [0..23], ditët e muajit [1..31], muaj [1..12], ditë të javës [0. .6], ku 0 është e diel. Fusha e fundit, e gjashta, është një linjë që do të ekzekutohet nga interpretuesi standard i komandës.
Në pesë fushat e para, vlerat mund të renditen të ndara me presje:
# задача, выполняемая в первую и десятую минуты каждого часа
1,10 * * * * /path/to/exec -a -b -cOse me vizë ndarëse:
# задача, выполняемая в каждую из первых десяти минут каждого часа
0-9 * * * * /path/to/exec -a -b -cQasja e përdoruesit në planifikimin e detyrave rregullohet në POSIX nga skedarët cron.allow dhe cron.deny, të cilët listojnë përdoruesit me akses në crontab dhe përdoruesit pa akses në program, respektivisht. Standardi nuk rregullon vendndodhjen e këtyre skedarëve në asnjë mënyrë.
Sipas standardit, të paktën katër variabla mjedisore duhet t'i kalojnë programeve të nisura:
- HOME - drejtoria kryesore e përdoruesit.
- LOGNAME - identifikimi i përdoruesit.
- PATH është rruga ku mund të gjeni shërbime standarde të sistemit.
- SHELL - rruga për përkthyesin e komandës së përdorur.
Veçanërisht, POSIX nuk thotë asgjë se nga vijnë vlerat për këto variabla.
Më i shituri - Vixie cron 3.0pl1
Paraardhësi i përbashkët i varianteve të njohura të cron është Vixie cron 3.0pl1, i prezantuar në listën e postimeve comp.sources.unix në 1992. Ne do të shqyrtojmë më në detaje tiparet kryesore të këtij versioni.
Vixie cron vjen në dy programe (cron dhe crontab). Si zakonisht, daemon është përgjegjës për leximin dhe ekzekutimin e detyrave nga tabela e detyrave të sistemit dhe tabelat individuale të detyrave të përdoruesit, dhe programi crontab është përgjegjës për redaktimin e tabelave të përdoruesve.
Tabela e detyrave dhe skedarët e konfigurimit
Tabela e detyrave të superpërdoruesit ndodhet në /etc/crontab. Sintaksa e tabelës së sistemit korrespondon me sintaksën e Vixie cron, me përjashtim që kolona e gjashtë në të tregon emrin e përdoruesit në emër të të cilit është nisur detyra:
# Запускается ежеминутно от пользователя vlad
* * * * * vlad /path/to/execTabelat e detyrave të zakonshme të përdoruesit janë të vendosura në /var/cron/tabs/username dhe përdorin të njëjtën sintaksë. Kur përdorni programin crontab si përdorues, këto janë skedarët që modifikohen.
Listat e përdoruesve me akses në crontab menaxhohen në skedarët /var/cron/allow dhe /var/cron/deny, ku thjesht duhet të futni emrin e përdoruesit në një rresht të veçantë.
Sintaksë e zgjeruar
Krahasuar me Crontab POSIX, zgjidhja e Paul Vixey përmban disa modifikime shumë të dobishme në sintaksën e tabelave të detyrave të programit.
Një sintaksë e re e tabelës është bërë e disponueshme: për shembull, mund të specifikoni ditët e javës ose muajt me emër (e hënë, e martë dhe kështu me radhë):
# Запускается ежеминутно по понедельникам и вторникам в январе
* * * Jan Mon,Tue /path/to/execJu mund të specifikoni hapin përmes të cilit nisen detyrat:
# Запускается с шагом в две минуты
*/2 * * * Mon,Tue /path/to/execHapat dhe intervalet mund të përzihen:
# Запускается с шагом в две минуты в первых десять минут каждого часа
0-10/2 * * * * /path/to/execMbështeten alternativat intuitive ndaj sintaksës së zakonshme (rinisje, çdo vit, çdo vit, mujore, javore, ditore, mesnatë, për orë):
# Запускается после перезагрузки системы
@reboot /exec/on/reboot
# Запускается раз в день
@daily /exec/daily
# Запускается раз в час
@hourly /exec/dailyMjedisi i ekzekutimit të detyrës
Vixie cron ju lejon të ndryshoni mjedisin e aplikacioneve që ekzekutohen.
Variablat e mjedisit USER, LOGNAME dhe HOME nuk sigurohen thjesht nga daemon, por janë marrë nga një skedar . Ndryshorja PATH vendoset në "/usr/bin:/bin" dhe ndryshorja SHELL është vendosur në "/bin/sh". Vlerat e të gjitha variablave përveç LOGNAME mund të ndryshohen në tabelat e përdoruesve.
Disa variabla të mjedisit (më së shumti SHELL dhe HOME) përdoren nga vetë cron për të ekzekutuar detyrën. Ja se si mund të duket përdorimi i bash në vend të sh standardit për të ekzekutuar detyrat e personalizuara:
SHELL=/bin/bash
HOME=/tmp/
# exec будет запущен bash-ем в /tmp/
* * * * * /path/to/execNë fund të fundit, të gjitha variablat e mjedisit të përcaktuara në tabelë (të përdorura nga cron ose të nevojshme nga procesi) do t'i kalohen detyrës së ekzekutimit.
Për të redaktuar skedarët, crontab përdor redaktorin e specifikuar në variablin e mjedisit VISUAL ose EDITOR. Nëse mjedisi ku u ekzekutua crontab nuk i ka të përcaktuara këto variabla, atëherë përdoret "/usr/ucb/vi" (ucb është ndoshta Universiteti i Kalifornisë, Berkeley).
cron në Debian и Ubuntu
Zhvilluesit Debian dhe shpërndarjet derivate u publikuan Vixie cron version 3.0pl1. Nuk ka dallime në sintaksën e skedarëve të tabelës; për përdoruesit është i njëjti cron Vixie. Tipari më i madh i ri: Mbështetje , и .
Ndryshimet më pak të dukshme, por të prekshme përfshijnë vendndodhjen e skedarëve të konfigurimit dhe tabelave të detyrave.
Tavolina të personalizuara në Debian ndodhen në direktorinë /var/spool/cron/crontabs, tabela e sistemit është ende aty - në /etc/crontab. Specifike për paketën Debian Tabelat e detyrave vendosen në /etc/cron.d, nga ku demoni cron i lexon automatikisht ato. Kontrolli i aksesit të përdoruesit rregullohet nga skedarët /etc/cron.allow dhe /etc/cron.deny.
Shell-i i parazgjedhur i komandës është ende /bin/sh, i cili përdoret në Debian shfaqet një shell i vogël i pajtueshëm me POSIX , nisur pa lexuar asnjë konfigurim (në modalitetin jo-interaktiv).
Vetë Cron në versionet më të fundit Debian Lançohet nëpërmjet systemd dhe konfigurimi i tij i nisjes mund të gjendet në /lib/systemd/system/cron.service. Nuk ka asgjë të veçantë në lidhje me konfigurimin e shërbimit; çdo menaxhim i detajuar i detyrave mund të kryhet nëpërmjet variablave të mjedisit të deklaruara direkt në crontab-in e secilit përdorues.
cronie në RedHat, Fedora dhe CentOS
— një degëzim i Vixie cron version 4.1. Si në Debian, sintaksa nuk ka ndryshuar, por është shtuar mbështetje për PAM dhe SELinux, duke punuar në një klaster, duke monitoruar skedarët duke përdorur inotify dhe veçori të tjera.
Konfigurimi i paracaktuar është në vendet e zakonshme: tabela e sistemit është në /etc/crontab, paketat vendosin tabelat e tyre në /etc/cron.d, tabelat e përdoruesve shkojnë në /var/spool/cron/crontabs.
Daemon funksionon nën kontrollin systemd, konfigurimi i shërbimit është /lib/systemd/system/crond.service.
Në shpërndarjet e ngjashme me Red Hat, /bin/sh përdoret si parazgjedhje në nisje, që është bash standard. Duhet të theksohet se kur ekzekutohen punët e cron nëpërmjet /bin/sh, guaska bash fillon në modalitetin në përputhje me POSIX dhe nuk lexon asnjë konfigurim shtesë, duke ekzekutuar në modalitetin jo-interaktiv.
cronie në SLES dhe openSUSE
Shpërndarja gjermane SLES dhe derivati i saj openSUSE përdorin të njëjtin cronie. Daemon këtu lëshohet gjithashtu nën systemd, konfigurimi i shërbimit ndodhet në /usr/lib/systemd/system/cron.service. Konfigurimi: /etc/crontab, /etc/cron.d, /var/spool/cron/tabs. /bin/sh është i njëjti bash që funksionon në modalitetin jo-interaktiv në përputhje me POSIX.
Pajisja Vixie Cron
Pasardhësit modernë të cron nuk kanë ndryshuar rrënjësisht në krahasim me Vixie cron, por megjithatë kanë fituar veçori të reja që nuk kërkohen për të kuptuar parimet e programit. Shumë nga këto shtesa janë të dizajnuara keq dhe ngatërrojnë kodin. Kodi burimor origjinal i cron nga Paul Vixey është një kënaqësi për t'u lexuar.
Prandaj, vendosa të analizoj pajisjen cron duke përdorur shembullin e një programi cron të përbashkët për të dy degët e zhvillimit - Vixie cron 3.0pl1. Unë do t'i thjeshtoj shembujt duke hequr ifdefët që ndërlikojnë leximin dhe duke lënë jashtë detajet e vogla.
Puna e demonit mund të ndahet në disa faza:
- Inicializimi i programit.
- Mbledhja dhe përditësimi i listës së detyrave për të ekzekutuar.
- Aktivizimi i ciklit kryesor të cron.
- Filloni një detyrë.
Le t'i shikojmë ato me radhë.
Inicializimi
Kur fillon, pas kontrollit të argumenteve të procesit, cron instalon mbajtësit e sinjalit SIGCHLD dhe SIGHUP. E para bën një hyrje në regjistër për përfundimin e procesit të fëmijës, e dyta mbyll përshkruesin e skedarit të skedarit të regjistrit:
signal(SIGCHLD, sigchld_handler);
signal(SIGHUP, sighup_handler);Cron daemon funksionon gjithmonë vetëm në sistem, vetëm si superpërdorues dhe nga direktoria kryesore cron. Thirrjet e mëposhtme krijojnë një skedar bllokimi me PID të procesit të demonit, sigurohuni që përdoruesi të jetë i saktë dhe ndryshoni drejtorinë aktuale në atë kryesore:
acquire_daemonlock(0);
set_cron_uid();
set_cron_cwd();Është vendosur shtegu i paracaktuar, i cili do të përdoret gjatë fillimit të proceseve:
setenv("PATH", _PATH_DEFPATH, 1);Më pas procesi "i demonizuar": ai krijon një kopje fëmijërore të procesit duke thirrur fork dhe një sesion të ri në procesin e fëmijës (duke thirrur setsid). Procesi prind nuk është më i nevojshëm dhe del:
switch (fork()) {
case -1:
/* критическая ошибка и завершение работы */
exit(0);
break;
case 0:
/* дочерний процесс */
(void) setsid();
break;
default:
/* родительский процесс завершает работу */
_exit(0);
}
Përfundimi i procesit prind çliron bllokimin në skedarin e kyçjes. Përveç kësaj, kërkohet të përditësohet PID në skedar tek fëmija. Pas kësaj, databaza e detyrave plotësohet:
/* повторный захват лока */
acquire_daemonlock(0);
/* Заполнение БД */
database.head = NULL;
database.tail = NULL;
database.mtime = (time_t) 0;
load_database(&database);Pastaj cron kalon në ciklin kryesor të punës. Por para kësaj, ia vlen t'i hedhim një sy ngarkimit të listës së detyrave.
Mbledhja dhe përditësimi i listës së detyrave
Funksioni load_database është përgjegjës për ngarkimin e listës së detyrave. Ai kontrollon crontab-in kryesor të sistemit dhe drejtorinë me skedarët e përdoruesit. Nëse skedarët dhe drejtoria nuk kanë ndryshuar, lista e detyrave nuk rilexohet. Përndryshe, një listë e re detyrash fillon të formohet.
Ngarkimi i një skedari sistemi me emra të veçantë skedarësh dhe tabelash:
/* если файл системной таблицы изменился, перечитываем */
if (syscron_stat.st_mtime) {
process_crontab("root", "*system*",
SYSCRONTAB, &syscron_stat,
&new_db, old_db);
}Ngarkimi i tabelave të përdoruesve në një lak:
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);
}
Pas së cilës baza e të dhënave e vjetër zëvendësohet me një të re.
Në shembujt e mësipërm, thirrja e funksionit process_crontab verifikon që ekziston një përdorues që përputhet me emrin e skedarit të tabelës (përveç nëse është një superpërdorues) dhe më pas thërret load_user. Ky i fundit tashmë e lexon vetë skedarin rresht pas rreshti:
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;
}
}Këtu, ose vendoset ndryshorja e mjedisit (linjat e formës VAR=vlera) duke përdorur funksionet load_env / env_set, ose përshkrimi i detyrës lexohet (* * * * * / path/to/exec) duke përdorur funksionin load_entry.
Entiteti i hyrjes që kthen load_entry është detyra jonë, e cila vendoset në listën e përgjithshme të detyrave. Vetë funksioni kryen një analizë të hollësishme të formatit të kohës, por ne jemi më të interesuar në formimin e variablave të mjedisit dhe parametrave të nisjes së detyrave:
/* пользователь и группа для запуска задачи берутся из 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);Cikli kryesor funksionon me listën aktuale të detyrave.
Laku kryesor
Cron origjinal nga Versioni 7 Unix funksionoi mjaft thjesht: ai rilexoi konfigurimin në një lak, nisi detyrat e minutës aktuale si superpërdorues dhe fjeti deri në fillimin e minutës tjetër. Kjo qasje e thjeshtë në makinat e vjetra kërkonte shumë burime.
Një version alternativ u propozua në SysV, në të cilin daemon shkoi të flinte ose deri në minutën më të afërt për të cilën ishte përcaktuar detyra, ose për 30 minuta. Më pak burime u harxhuan për rileximin e konfigurimit dhe kontrollimin e detyrave në këtë mënyrë, por përditësimi i shpejtë i listës së detyrave u bë i papërshtatshëm.
Vixie cron u kthye në kontrollimin e listave të detyrave një herë në minutë, për fat të mirë në fund të viteve '80 kishte shumë më shumë burime në makinat standarde 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;
}
Funksioni cron_sleep është i përfshirë drejtpërdrejt në ekzekutimin e detyrave, duke thirrur funksionet job_runqueue (numëro dhe ekzekuto detyrat) dhe do_command (ekzekuto çdo detyrë individuale). Funksioni i fundit ia vlen të shqyrtohet më në detaje.
Kryerja e një detyre
Funksioni do_command ekzekutohet në stil të mirë Unix, domethënë bën një fork për të kryer detyrën në mënyrë asinkrone. Procesi prind vazhdon të nisë detyrat, procesi i fëmijës përgatit procesin e detyrës:
switch (fork()) {
case -1:
/*не смогли выполнить fork */
break;
case 0:
/* дочерний процесс: на всякий случай еще раз пробуем захватить главный лок */
acquire_daemonlock(1);
/* переходим к формированию процесса задачи */
child_process(e, u);
/* по завершению дочерний процесс заканчивает работу */
_exit(OK_EXIT);
break;
default:
/* родительский процесс продолжает работу */
break;
}Ka shumë logjikë në child_process: ai merr dalje standarde dhe transmetime gabimesh në vetvete, në mënyrë që ta dërgojë atë në postë (nëse ndryshorja e mjedisit MAILTO është specifikuar në tabelën e detyrave) dhe, në fund, pret për kryesoren procesi i detyrës për të përfunduar.
Procesi i detyrës formohet nga një pirun tjetër:
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;
}Kjo është në thelb e gjitha cron është. Unë hoqa disa detaje interesante, për shembull, llogaritjen e përdoruesve të largët, por përshkrova gjënë kryesore.
pasthënje
Cron është një program çuditërisht i thjeshtë dhe i dobishëm, i ndërtuar në traditat më të mira të Unix. Nuk bën asgjë shtesë, por e ka bërë punën e tij jashtëzakonisht mirë për dekada të tëra. Ja një vështrim në kodin për versionin që vjen me UbuntuNuk më mori më shumë se një orë dhe u argëtova shumë! Shpresoj se arrita ta ndaja me ju.
Nuk e di për ju, por jam pak i trishtuar kur kuptoj se programimi modern, me tendencën e tij për të mbi-komplikuar dhe tepër abstrakte, nuk ka qenë i favorshëm për një thjeshtësi të tillë për një kohë të gjatë.
Ka shumë alternativa moderne për cron: systemd-timers ju lejojnë të organizoni sisteme komplekse me varësi, fcron ju lejon të rregulloni më fleksibël konsumin e burimeve sipas detyrave. Por personalisht, më mjaftonte gjithmonë krontabi më i thjeshtë.
Me pak fjalë, duajeni Unix-in, përdorni programe të thjeshta dhe mos harroni të lexoni mana për platformën tuaj!
Burimi: www.habr.com
