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

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

Klasi thuhet se orët e lumtura nuk vëzhgojnë. Në ato kohëra primitive nuk kishte as programues, as Unix, por sot programuesit e dinë me siguri: për ta ndjekur kohën, përdorim cron.

Utilitarët e linjës së komandave janë njëherësh dobësi dhe zakon për mua. sed, awk, wc, cut dhe programe të tjera të vjetra ekzekutohen nga skriptet në serverët tanë çdo ditë. Shumica e tyre janë formuar si detyra për cron, planifikuesi që daton nga vitet '70.

Kam përdorur cron në një nivel sipërfaqësor për një kohë të gjatë, pa u thelluar në detaje, por një herë, duke u përballur me një gabim gjatë ekzekutimit të skriptit, vendosa të merrem me të në thelb. Kështu lindi ky artikull, në të cilin kam njohur POSIX crontab, variantet kryesore të cron në shpërndarjet e njohura të Linux dhe strukturën e disa prej tyre.

Po përdorni Linux dhe po ekzekutoni detyra në cron? Ju intereson arkitektura e aplikacioneve sistemore në Unix? Atëherë jemi në të njëjtën rrugë!

Përmbajtja

Origjina e specieve

Ekzekutimi periodik i programeve të përdoruesve ose sistemeve është një nevojë e qartë në të gjitha sistemet operative. Prandaj, nevoja për shërbime që lejojnë planifikimin dhe ekzekutimin e centralizuar të detyrave, programuesit e kuptuan shumë kohë më parë.

Sistemet operative të ngjashme me Unix rrjedhin nga Versioni 7 i Unix, i zhvilluar në vitet '70 në Bell Labs, përfshirë dhe të famshmin Ken Thompson. Bashkë me Versionin 7 të Unix shitej edhe cron, një shërbim për ekzekutimin e rregullt të detyrave nga superpërdoruesi.

Një cron modern tipik është një program i thjeshtë, por algoritmi i funksionimit të variantit origjinal ishte edhe më i thjeshtë: shërbimi zgjohesh nga minuta në minutë, lexonte një tabelë me detyra nga një skedar të vetëm (/etc/lib/crontab) dhe ekzekutonte për superpërdoruesin ato detyra që duhej të përfundoheshin në minutën aktuale.

Më vonë, variantet e përmirësuara të shërbimit të thjeshtë dhe të dobishëm u ofruan me të gjitha sistemet operative të ngjashme me Unix.

Përkufizimet e përgjithshme të formatit crontab dhe parimeve bazë të funksionimit të utilitarit u përfshinë në standardin kryesor të sistemeve operuese të ngjashme me Unix në vitin 1992 — POSIX — duke i dhënë kështu cron-it nga standardi de facto statusin e standardit de jure.

Në vitin 1987, Paul Vixie, pas një anketimi të përdoruesve të Unix për dëshirat e tyre në lidhje me cron, publikoi një version tjetër të demonit, i cili rregulloi disa probleme të kronit tradicional dhe zgjeroi sintaksën e skedarëve të tabelave.

Me versionin e tretë, Vixie cron përmbushi kërkesat e POSIX, madje programi kishte një licencë liberale, në fakt nuk kishte asnjë licencë, përveç dëshirave në README: autori nuk jep garanci, emri i autorit nuk mund të fshihet, dhe programi mund të shitej vetëm me kodin burimor. Këto kërkesa u treguan të përshtatshme me principet e softuerit të lirë, që fillonin të fitonin popullaritet në vitet '90, prandaj disa nga distribucionet kryesore që u shfaqën në fillim të viteve '90, e morën Vixie cron si sistemin e tyre dhe e zhvillojnë ende sot.

Në veçanti, Red Hat dhe SUSE po zhvillojnë forkun e Vixie cron — cronie, ndërsa Debian dhe Ubuntu përdorin edicionin origjinal të Vixie cron me shumë patch-e.

Le të njohim fillimisht mjetin e përdoruesit crontab të përshkruar në POSIX, pastaj do të shqyrtojmë zgjerimet e sintaksës së paraqitura në Vixie cron dhe përdorimin e varianteve të Vixie cron në distribucione të njohura Linux. Dhe, përfundimisht, kjo është qershia mbi tortë — analiza e strukturës së demonit cron.

POSIX crontab

Nëse cron-i origjinal ka funksionuar gjithmonë për super përdorues, programet moderne të planifikimit shpesh trajtojnë detyra të përdoruesve të zakonshëm, që është më e sigurt dhe e përshtatshme.

Crona vijnë si një komplekse prej dy programesh: një demoni cron që punon vazhdimisht dhe mjeti crontab i aksesueshëm për përdoruesit. Ky i fundit lejon redaktimin e tabelave të detyrave specifike për çdo përdorues në sistem, ndërsa demoni ekzekuton detyrat nga tabelat e përdoruesve dhe tabelat sistemore.

Standardi POSIX nuk përshkruan sjelljen e demonit dhe formalisht vetëm programin e përdoruesit crontab. Ekzistenca e mekanizmave për nisjen e detyrave të përdoruesve, sigurisht, nënkuptohet, por nuk përshkruhet në hollësi.

Duke thirrjes së utilitarit crontab, mund të bëni katër gjëra: të redaktoni tabelën e detyrave për përdoruesin në editor, të ngarkoni tabelën nga një skedar, të shfaqni tabelën aktuale të detyrave dhe të pastroni tabelën e detyrave. Shembuj të punës së utilitarit crontab:

crontab -e # redaktoni tabelën e detyrave
crontab -l # shfaqni tabelën e detyrave
crontab -r # fshini tabelën e detyrave
crontab path/to/file.crontab # ngarkoni tabelën e detyrave nga një skedar

Në thirrje crontab -e do të përdoret editori i caktuar në variablën standarde të ambientit EDITOR.

Detyrat vetë janë të përshkruara në këtë format:

# строки-комментарии игнорируются
#
# задача, выполняемая ежеминутно
* * * * * /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ë shënimeve: minuta [1..60], orë [0..23], ditë të muajit [1..31], muaj [1..12], ditë të javës [0..6], ku 0 është e diela. E fundit, fusha e gjashtë, është një varg që do të ekzekutohet nga interpretuasi standard i komandave.

Në pesë fushat e para, vlerat mund të listohen me presje:

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

Ose me një mecë:

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

Qasja e përdoruesve në planifikimin e detyrave rregullohet në skedarin POSIX cron.allow dhe cron.deny në të cilat janë listuar, përkatësisht, përdoruesit me qasje në crontab dhe përdoruesit pa akses në program. Lokacioni i këtyre skedareve nuk rregullohet në asnjë mënyrë standarde.

Sistemet e nisura, sipas standardeve, duhet t'i kalojnë të paktën katër variabla mjedisorë:

  1. HOME — dosja e përdoruesit.
  2. LOGNAME — përdoruesi.
  3. PATH — rruga ku mund të gjenden utilitat standard të sistemit.
  4. SHELL — rruga për interpretuesin e komandave të përdorur.

Vlen të theksohet se POSIX nuk përmend asgjë për burimin e vlerave për këta variabla.

Hiti i sh Sales — Vixie cron 3.0pl1

Parardhësi i njohur i varianteve populare të cron është Vixie cron 3.0pl1, i paraqitur në dërgesën comp.sources.unix në vitin 1992. Ne do të shqyrtojmë më në hollësi karakteristikat kryesore të kësaj versioni.

Vixie cron vjen në dy programe (cron dhe crontab). Si zakonisht, demoni është përgjegjës për leximin dhe ekzekutimin e detyrave nga tabela e sistemit dhe tabelat e detyrave të përdoruesve individualë, ndërsa utilita crontab është përgjegjëse 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 përputhet me sintaksën e Vixie cron, përveç se kolonën e gjashtë e shënon emri i përdoruesit nga i cili ekzekutohet detyra:

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

Tabela e detyrave të përdoruesve të zakonshëm gjenden në /var/cron/tabs/username dhe përdorin sintaksën e zakonshme. Ndërsa ekzekutohet utilitarja crontab në emër të përdoruesit, këto skedarë redaktohen.

Menaxhimi i listave të përdoruesve që kanë access në crontab bëhet në skedarët /var/cron/allow dhe /var/cron/deny, ku mjafton të shtoni emrin e përdoruesit në një rresht të veçantë.

Sintaksë e zgjeruar

Në krahasim me POSIX crontab, zgjidhja e Paul Vixie përmban disa modifikime shumë të dobishme në sintaksën e tabelave të detyrave të utilitarit.

Një sintaksë e re tabelash është bërë e disponueshme: për shembull, mund të specifikoni ditët e javës ose muajt emër për emër (Mon, Tue etj.):

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

Mund të specifikoni hapat, nëpër të cilat ekzekutohen detyrat:

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

Hapat dhe intervalet mund të kombinohen:

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

Mund të suportohen alternativa intuitive për sintaksën e zakonshme (reboot, yearly, annually, monthly, weekly, daily, midnight, hourly):

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

Mjedisi i ekzekutimit të detyrave

Vixie cron lejon ndryshimin e ambientit të aplikacioneve të ekzekutuara.

Variablat e ambientit USER, LOGNAME dhe HOME jo vetëm që ofrohen nga demoni, por gjithashtu merren nga skedari. passwd. Variabla PATH merr vlerën "/usr/bin:/bin", ndërsa SHELL merr "/bin/sh". Vlerat e të gjitha variablave, përveç LOGNAME, mund të ndryshojnë në tabelat e përdoruesve.

Disa variabla mjedisi (përparësisht SHELL dhe HOME) përdoren nga cron për të ekzekutuar detyrat. Ja si mund të duket përdorimi i bash në vend të standardit sh për ekzekutimin e detyrave të përdoruesit:

SHELL=/bin/bash
HOME=/tmp/
# exec do të ekzekutohet me bash në /tmp/
* * * * * /path/to/exec

Në përfundim, të gjitha variablat e mjedisit të përcaktuara në tabelë (të përdorura nga cron ose të nevojshme për procesin) do të kalojnë në detyrën e ekzekutuar.

Për të redaktuar skedarët me utilitarin crontab, përdoret redaktori i caktuar në variablën e mjedisit VISUAL ose EDITOR. Nëse këto variabla nuk janë të përcaktuara në ambientin ku është ekzekutuar crontab, atëherë përdoret "/usr/ucb/vi" (ucb ndoshta i referohet Universitetit të Kalifornisë, Berkeley).

cron në Debian dhe Ubuntu

Zhvilluesit e Debian dhe distribucioneve të bazuar në të lëshuan një version të modifikuar rëndë versionin Vixie cron 3.0pl1. Nuk ka ndryshime në sintaksën e skedarëve të tabelave, për përdoruesit është po ai Vixie cron. Mundësitë e reja më të mëdha: mbështetje për syslog, SELinux dhe PAM.

Ndryshimet që nuk janë aq të dukshme, por janë të prekshme — pozita e skedave të konfigurimit dhe tabelave të detyrave.

Tabelat e përdoruesve në Debian ndodhen në direktorinë /var/spool/cron/crontabs, ndërsa tabela sistemike gjithashtu ndodhet atje — në /etc/crontab. Tabelat e detyrave specifike për paketat Debian vendosen në /etc/cron.d, nga ku demonët cron i lexojnë automatikisht. Menaxhimi i aksesit të përdoruesve rregullohet nga skedarët /etc/cron.allow dhe /etc/cron.deny.

Si shell i komandës, ende përdoret /bin/sh, ku në Debian përfaqësohet nga një shell i vogël i përputhshëm me POSIX dash, i nisur pa lexuar ndonjë konfigurim (në modin jo-interaktiv).

Vetë cron në versionet më të fundit të Debian aktivizohet përmes systemd, dhe konfigurimi i nisjes mund të shikohet në /lib/systemd/system/cron.service. Nuk ka ndonjë gjë të veçantë në konfigurimin e shërbimit, çdo menaxhim më të hollësishëm të detyrave mund të realizohet përmes variablave të ambientit, të shpallura drejtpërdrejt në crontab të secilit përdorues.

cronie në RedHat, Fedora dhe CentOS

cronie — fork i Vixie cron version 4.1. As in Debian, the syntax hasn't changed, but support for PAM and SELinux, cluster operations, file tracking using inotify, and other features have been added.

The default configuration is located in standard places: the system table — in /etc/crontab, packages place their tables in /etc/cron.d, and user tables go to /var/spool/cron/crontabs.

The daemon runs under systemd, and the service configuration is at /lib/systemd/system/crond.service.

In Red Hat-based distributions, /bin/sh is used by default when starting, where the standard bash acts as the shell. It should be noted that when starting cron jobs through /bin/sh, the bash shell runs in POSIX-compatible mode and does not read any additional configuration, operating in non-interactive mode.

cronie në SLES dhe openSUSE

The German distribution SLES and its derivative openSUSE use the same cronie. The daemon here also runs under systemd, and the service configuration is located at /usr/lib/systemd/system/cron.service. Configuration: /etc/crontab, /etc/cron.d, /var/spool/cron/tabs. The same bash is used as /bin/sh, launched in a POSIX-compatible non-interactive mode.

Struktura e Vixie cron

Pasardhësit modernë të cron, krahasuar me cron-in e Vixie, nuk kanë ndryshuar në mënyrë radikale, por gjithsesi kanë fituar mundësi të reja që nuk janë të nevojshme për të kuptuar parimet e funksionimit të programit. Shumica e këtyre zgjerimeve janë të njohura për kaotizmin e tyre dhe ngatërrojnë kodin. Kodi origjinal i cron-it në interpretimin e Paul Vixie është një kënaqësi për t'u lexuar.

Prandaj, vendosa të shqyrtoj mekanizmin e cron në shembujt e zakonshëm për të dy degët e zhvillimit të programit cron — Vixie cron 3.0pl1. Do ta thjeshtoj shembujt, duke eliminuar ifdef-ët që e komplikojnë leximin dhe duke lënë mënjanë detaje sekondare.

Funksionimi i demonit mund të ndahet në disa etapa:

  1. Inicializimi i programit.
  2. Grupimi dhe përditësimi i listës së detyrave për t'u ekzekutuar.
  3. Funksionimi i ciklit kryesor të cron.
  4. Ekzekutimi i detyrës.

Le të shqyrtojmë këto në rend.

Inicializimi

Kur fillon, pasi të kontrollohen argumentet, procesi cron vendos menaxherët e sinjalit SIGCHLD dhe SIGHUP. I pari regjistron një skaj në jurnal për përfundimin e një procesi dytësor, ndërsa i dyti mbyll nga dosja e regjistrit:

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

Demonët cron në sistem punon gjithmonë vetëm, në rolin e super përdoruesit dhe nga direktorja kryesore cron. Thirrjet e mëposhtme krijojnë një skedar-log me PID-in e procesit demon, sigurohen që përdoruesi është i saktë dhe ndryshojnë direktorjen aktuale në të parën:

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

Vendoset rruga si parazgjedhje, e cila do të përdoret gjatë ekzekutimit të proceseve:

setenv("PATH", _PATH_DEFPATH, 1);

Më pas procesi "demonizohet": krijon një kopje dytësore të procesit përmes thirrjes fork dhe një seancë të re në procesin dytësor (thirrja setsid). Në procesin e prindit nuk ka më nevojë — dhe ai përfundon punën:

switch (fork()) {
case -1:
    /* gabim kritik dhe përfundim i punës */
    exit(0);
break;
case 0:
    /* procesi dytësor */
    (void) setsid();
break;
default:
    /* procesi i prindit përfundon punën */
    _exit(0);
}

Përfundimi i procesit të prindit çliron bllokimin në skedarin-log. Për më tepër, kërkohet të përditësohet PID në skedarin për atë të dytësor. Pas kësaj, mbushet baza e detyrave:

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

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

Më pas cron kalon në ciklin kryesor të punës. Por para kësaj, është mirë të shikoni ngarkesën e listës së detyrave.

Mblidhen dhe përditësohen listat e 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ërdoruesve. Nëse skedarët dhe drejtoria nuk kanë ndryshuar, lista e detyrave nuk rilexohet. Në të kundërt, fillon të formohet një listë e re detyrash.

Ngarko skedarin e sistemit me emra skedari dhe tabela speciale:

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

Ngarkimi i tabelave të përdoruesve në cikël:

while (NULL != (dp = readdir(dir))) {
    char    fname[MAXNAMLEN+1],
            tabname[MAXNAMLEN+1];
    /* nuk nevojitet të lexoni skedarët me pikë */
    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);
}

Pasiqë, baza e vjetër e të dhënave zëvendësohet me të re.

Në shembujt e mësipërm, thirrja e funksionit process_crontab siguron ekzistencën e përdoruesit përkatës të emrit të skedarit të tabelës (nëse nuk është përdorues super), e pas kësaj thirr load_user. Kjo e fundit lexon 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 një variabël ambienti (rrjedha VAR=vlera) përmes funksioneve load_env / env_set, ose është e mundur të lexoni përshkrimin e detyrës (***** /path/to/exec) përmes funksionit load_entry.

Enti entry që kthehet nga load_entry është detyra jonë, e vendosur në listën e përbashkët të detyrave. Në funksion, kryhet një analizë e gjatë e formatit të kohës; ne jemi më shumë të interesuar për formimin e variablave të ambientit dhe parametrave të startimit të detyrës:

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

Cikli kryesor

Cron origjinal nga Version 7 Unix punonte shumë thjeshtë: në cikël, rregullonte konfigurimin, fillonte detyrat e minutës aktuale si superpërdorues dhe flinte deri në fillimin e minutës së ardhshme. Ky qasje e thjeshtë kërkonte shumë burime në makinat e vjetra.

Në SysV u propozua një version alternativ, në të cilin dema flinte deri në minutën më të afërt për të cilën është përcaktuar një detyrë, ose për 30 minuta. Burimet për rregullimin e konfigurimit dhe verifikimin e detyrave në këtë mod konsumoheshin më pak, por u bë e padëshirueshme të përditësohej shpejt lista e detyrave.

Vixie cron u rikthe në kontrollimin e listave të detyrave një herë në minutë, falë rritjes së burimeve në makinat standarde Unix deri në fund të viteve '80.

/* первичная загрузка задач */
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 i drejtpërdrejtë që kryen detyrat është cron_sleep, që thërret funksionet job_runqueue (shkarkimi dhe nisja e detyrave) dhe do_command (nisja e secilës detyrë të veçantë). Ky funksion meriton një shqyrtim më të detajuar.

Nisja e detyrës

Funksioni do_command është i realizuar në një stil të mirë Unix, dmth. për të realizuar asinkronisht një detyrë, ai bën fork. Procesi prind vazhdon të niste detyrat, ndërsa ai fëmijë përgatit procesin e detyrës:

switch (fork()) {
case -1:
    /*nuk mundëm të realizonim fork */
    break;
case 0:
    /* procesi fëmijë: për siguri provoni përsëri të kapni lokun kryesor */
    acquire_daemonlock(1);
    /* kalojmë në formimin e procesit të detyrës */
    child_process(e, u);
    /* me përfundimin, procesi fëmijë përfundon punën e tij */
    _exit(OK_EXIT);
    break;
default:
    /* procesi prind vazhdon punën */
    break;
}

Në child_process ka shumë logjikë: ai merr standardin e daljeve dhe gabimeve për t'i dërguar më pas me email (nëse variabli i mjedisit MAILTO është i pranishëm në tabelën e detyrave) dhe, në fund, pret përfundimin e procesit kryesor të detyrës.

Procesi i detyrës formohet nga një fork tjetër:

switch (vfork()) {
case -1:
    /* në rast të një gabimi, puna ndalohet menjëherë */
    exit(ERROR_EXIT);
case 0:
    /* processi-në-në-në nga formon një sesion të ri, terminalin etj.
     */
    (void) setsid();

    /*
     * më pas, konfigurojmë daljen e procesit, do ta anashkalojmë për shkak të shkurtësisë
     */

    /* ndryshimi i direktorive, përdoruesit dhe grupit të përdoruesit,
     * domethënë procesi nuk është më Superpërdorues */
    setgid(e->gid);
    setuid(e->uid);
    chdir(env_get("HOME", e->envp));

    /* nisja e vetë komandës */
    {
        /* variabla mjedisi SHELL tregon interpretuesin për ekzekutim */
        char    *shell = env_get("SHELL", e->envp);

        /* procesi niset pa kaluar mjedisin e procesit prind,
         * dmth kështu siç përshkruhet në tabelën e detyrave të përdoruesit */
        execle(shell, shell, "-c", e->cmd, (char *)0, e->envp);

        /* gabim — dhe procesi nuk u nis? mbyllja e punës */
        perror("execl");
        _exit(ERROR_EXIT);
    }
    break;
default:
    /* vetë procesi vazhdon punën: pret për përfundimin e punës dhe daljen */
    break;
}

Kjo është, në thelb, e gjithë cron. Ndërsa kam anashkaluar disa detaje interesante, siç është llogaritja e përdoruesve të largët, kam përshkruar të rëndësishmen.

Pasthënie

Cron — një program befasueshëm i thjeshtë dhe i dobishëm, i realizuar në traditat më të mira të botës Unix. Ai nuk bën asgjë të tepruar, por e kryen punën e tij jashtëzakonisht mirë për disa dekada. Njoftimi me kodin e versions që vjen me Ubuntu nuk zuri më shumë se një orë, dhe e kam shijuar shumë! Shpresoj që kam arritur ta ndaj këtë me ju.

Nuk e di për ju, por mua më duket pak e trishtë të kuptoj se programimi modern me prirjen e tij për tepricë dhe tepricë abstraksioni, prej kohësh nuk ofron thjeshtësinë e tillë.

Ekzistojnë shumë alternativa moderne për cron: systemd-timers lejojnë organizimin e sistemeve komplekse me varësi, ndërsa fcron ofron një rregullim më të shkathët të konsumit të burimeve nga detyrat. Por personalisht, gjithmonë më ka mjaftuar crontab më i thjeshtë.

Për të thënë ndryshe, duajeni Unix-in, përdorni programe të thjeshta dhe mos harroni të lexoni man pages për platformën tuaj!

Burimi: habr.com

Bli një hosting të besueshëm për faqet me mbrojtje DDoS, VPS VDS serverë 🔥 Bli një hosting të besueshëm për faqet me mbrojtje DDoS, VPS VDS serverë | ProHoster