Cron në Linux: historia, përdorimi dhe pajisja

Cron në Linux: historia, përdorimi dhe pajisja

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.

Për një kohë të gjatë e përdora cron në mënyrë sipërfaqësore, pa hyrë në detaje, por një ditë, kur hasa një gabim gjatë ekzekutimit të një skripti, vendosa ta shqyrtoja plotësisht. Kështu u shfaq ky artikull, ndërsa e shkruaja u njoha me Crontab POSIX, opsionet kryesore të cron në shpërndarjet e njohura Linux dhe strukturën e disa prej tyre.

A po përdorni Linux dhe po kryeni detyrat cron? Jeni të interesuar për arkitekturën e aplikacioneve të sistemit në Unix? Atëherë ne jemi në rrugën tonë!

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.

Nga versioni i tretë i Vixie cron filloi të plotësonte kërkesat POSIX, përveç kësaj, programi kishte një licencë liberale, ose më saktë nuk kishte fare licencë, përveç dëshirave në README: autori nuk jep garanci, emri i autorit nuk mund të fshihet dhe programi mund të shitet vetëm së bashku me kodin burimor. Këto kërkesa doli të ishin në përputhje me parimet e softuerit të lirë që po fitonte popullaritet në ato vite, kështu që disa nga shpërndarjet kryesore Linux që u shfaqën në fillim të viteve '90 morën Vixie cron si sistemin e tyre dhe po e zhvillojnë ende sot.

Në veçanti, Red Hat dhe SUSE zhvillojnë një fork të Vixie cron - cronie, dhe Debian dhe Ubuntu përdorin edicionin origjinal të Vixie cron me shumë arna.

Le të njihemi fillimisht me crontab-in e përdorimit të përdoruesit të përshkruar në POSIX, pas së cilës do të shikojmë zgjerimet sintaksore të ofruara në Vixie cron dhe përdorimin e variacioneve të Vixie cron në shpërndarjet e njohura Linux. Dhe së fundi, qershia në tortë është analiza e pajisjes cron daemon.

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.

В Standardi POSIX sjellja e demonit nuk përshkruhet në asnjë mënyrë dhe vetëm programi i përdoruesit është i zyrtarizuar crontab. 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.log

Pesë 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 -c

Ose me vizë ndarëse:

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

Qasja 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:

  1. HOME - drejtoria kryesore e përdoruesit.
  2. LOGNAME - identifikimi i përdoruesit.
  3. PATH është rruga ku mund të gjeni shërbime standarde të sistemit.
  4. 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/exec

Tabelat 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/exec

Ju mund të specifikoni hapin përmes të cilit nisen detyrat:

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

Hapat dhe intervalet mund të përzihen:

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

Mbë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/daily

Mjedisi 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 passwd. 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/exec

Në 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 dhe Ubuntu

Zhvilluesit e Debian dhe shpërndarjet e derivateve kanë lëshuar version shumë i modifikuar 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 syslog, SELinux и Pam.

Ndryshimet më pak të dukshme, por të prekshme përfshijnë vendndodhjen e skedarëve të konfigurimit dhe tabelave të detyrave.

Tabelat e përdoruesve në Debian janë të vendosura në drejtorinë /var/spool/cron/crontabs, tabela e sistemit është ende atje - në /etc/crontab. Tabelat e detyrave specifike të paketës Debian vendosen në /etc/cron.d, nga ku cron daemon i lexon ato automatikisht. Kontrolli i aksesit të përdoruesit kontrollohet nga skedarët /etc/cron.allow dhe /etc/cron.deny.

Predha e paracaktuar është ende /bin/sh, e cila në Debian është një guaskë e vogël në përputhje me POSIX lyerje, nisur pa lexuar asnjë konfigurim (në modalitetin jo-interaktiv).

Vetë Cron në versionet më të fundit të Debian lëshohet përmes systemd dhe konfigurimi i nisjes mund të shihet në /lib/systemd/system/cron.service. Nuk ka asgjë të veçantë në konfigurimin e shërbimit; çdo menaxhim më delikat i detyrës mund të bëhet përmes variablave të mjedisit të deklaruara drejtpërdrejt në crontab të çdo përdoruesi.

cronie në RedHat, Fedora dhe CentOS

kronikë — fork i Vixie cron version 4.1. Ashtu si në Debian, sintaksa nuk ka ndryshuar, por është shtuar mbështetja për PAM dhe SELinux, puna në një grup, ndjekja e skedarëve 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:

  1. Inicializimi i programit.
  2. Mbledhja dhe përditësimi i listës së detyrave për të ekzekutuar.
  3. Aktivizimi i ciklit kryesor të cron.
  4. 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 krijuar në traditat më të mira të botës Unix. Ajo nuk bën asgjë shtesë, por e bën punën e saj mrekullisht prej disa dekadash tashmë. Marrja e kodit për versionin që vjen me Ubuntu nuk zgjati më shumë se një orë dhe u argëtova shumë! Shpresoj se kam mundur ta ndaj 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

Shto një koment