Cron in Linux: storia, usu è dispusitivu

Cron in Linux: storia, usu è dispusitivu

U classicu hà scrittu chì l'ora felice ùn sò micca osservati. In quelli tempi salvatichi, ùn ci era micca programatori o Unix ancora, ma in questi ghjorni, i programatori sò sicuru: invece di elli, cron tracciarà u tempu.

L'utilità di a linea di cumanda sò à tempu debule è rutina per mè. sed, awk, wc, cut è altri prugrammi antichi sò gestiti da scripts nantu à i nostri servitori ogni ghjornu. Parechji di elli sò pensati cum'è compiti per cron, un pianificatore di l'anni 70.

Aghju utilizatu cron superficialmente per un bellu pezzu, senza sfondà in i dettagli, ma un ghjornu, affruntatu cù un errore quandu eseguisce u script, decisu di guardà bè. Hè cusì chì questu articulu hè apparsu, mentre scrivendu aghju familiarizatu cù POSIX crontab, l'opzioni cron principali in distribuzioni Linux populari è a struttura di alcuni di elli.

Aduprate Linux è eseguite attività cron? Sò interessatu à l'architettura di l'applicazioni di u sistema in Unix? Allora simu in strada !

Cuntenuti

Origine di e spezie

L'esecuzione periodica di i prugrammi di l'utilizatori o di u sistema hè una necessità evidente in tutti i sistemi operativi. Per quessa, i programatori anu ricunnisciutu a necessità di servizii chì permettenu a pianificazione centralizata è l'esekzione di i travaglii per un tempu assai longu.

I sistemi operativi Unix-like trace i so urighjini à a Versione 7 Unix, sviluppata in l'anni 70 di u seculu passatu à i Bell Labs, cumpresu da u famosu Ken Thompson. A versione 7 Unix hà ancu inclusu cron, un serviziu per eseguisce regularmente e attività superuser.

Un cron mudernu tipicu hè un prugramma simplice, ma l'algoritmu di a versione originale era ancu più simplice: u serviziu si sveglia una volta à u minutu, leghje una tavola cù i travaglii da un unicu schedariu (/etc/lib/crontab) è realizatu per u superuser. quelli travaglii chì duveranu esse cumpletati in u minutu attuale.

In seguitu, versioni mejorate di u serviziu simplice è utile sò stati furniti cù tutti i sistemi operativi Unix-like.

Descrizioni generalizati di u formatu crontab è i principii basi di u funziunamentu di l'utilità sò stati inclusi in u standard principale di sistemi operativi Unix-like - POSIX - in u 1992, è cusì cron da un standard de facto hè diventatu un standard de jure.

In u 1987, Paul Vixie, dopu à u sondaghju di l'utilizatori di Unix nantu à i desideri di cron, hà liberatu una altra versione di u daemon chì risolva alcuni di i prublemi di cron tradiziunale è allargò a sintassi di i schedarii di tabella.

Da a terza versione di Vixie cron cuminciò à scuntrà i requisiti POSIX, in più, u prugramma avia una licenza liberale, o piuttostu ùn ci era micca licenza à tutti, fora di i desideri in u README: l'autore ùn dà micca garanzie, u nome di l'autore. ùn pò esse sguassati, è u prugrammu pò esse vindutu solu inseme cù u codice fonte. Queste esigenze sò diventate cumpatibili cù i principii di u software liberu chì guadagnava pupularità in quelli anni, cusì alcune di e distribuzioni Linux chjave chì apparsu à l'iniziu di l'anni 90 anu pigliatu Vixie cron cum'è u so sistema è sò sempre sviluppatu oghje.

In particulare, Red Hat è SUSE sviluppanu una furchetta di Vixie cron - cronie, mentri Debian è Ubuntu utilizanu l'edizione originale di Vixie cron cù parechje patches.

Facemu prima cunniscenze cù l'utilità crontab di l'utilizatori descritte in POSIX, dopu avè fighjatu l'estensioni di sintassi furnite in Vixie cron è l'usu di variazioni di Vixie cron in distribuzioni Linux populari. È infine, a cirasa nantu à a torta hè l'analisi di u dispusitivu cron daemon.

POSIX crontab

Mentre chì u cron uriginale sempre curria per u superuser, i pianificatori muderni sò più prubabile di trattà cù i travaglii regulari di l'utilizatori, chì hè più sicuru è più convenientu.

Crons vene cun un set di dui prugrammi: un daemon cron in esecuzione constantemente è una utilità crontab accessibile per l'utilizatori. L'ultime permette di edità e tavule di attività specifiche per ogni utilizatore in u sistema, mentre chì u daemon eseguisce i travaglii da e tavule di l'utilizatori è di u sistema.

В standard POSIX u cumpurtamentu di u demoniu ùn hè micca scrittu in ogni modu è solu u prugramma di l'utilizatori hè formalizatu crontab. L'esistenza di meccanismi per lancià e funzioni di l'utilizatori hè, sicuru, implicata, ma micca descrittu in dettaglio.

Ci hè quattru cose chì ponu esse fatte chjamendu l'utilità crontab: edità a tavola di l'utilizatori in l'editore, carica a tavola da un schedariu, mostra a tavola di u travagliu attuale è sguassate a tavola di u travagliu. Esempii di l'utilità crontab:

crontab -e # редактировать таблицу задач
crontab -l # показать таблицу задач
crontab -r # удалить таблицу задач
crontab path/to/file.crontab # загрузить таблицу задач из файла

Quandu si chjama crontab -e l'editore specificatu in a variabile di l'ambiente standard serà utilizatu EDITOR.

I travaglii stessi sò descritti in u seguente formatu:

# строки-комментарии игнорируются
#
# задача, выполняемая ежеминутно
* * * * * /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

I primi cinque campi di registri: minuti [1..60], ore [0..23], ghjorni di u mese [1..31], mesi [1..12], ghjorni di a settimana [0.. 6], induve 0 - dumenica. L'ultimu, sestu, campu hè una linea chì serà eseguita da l'interprete standard di cumandamentu.

In i primi cinque campi, i valori ponu esse listati separati da virgule:

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

O cù un trattino:

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

L'accessu di l'utilizatori à a pianificazione di u travagliu hè regulatu in POSIX da i schedari cron.allow è cron.deny, chì listanu, rispettivamente, l'utilizatori cù l'accessu crontab è l'utilizatori senza accessu à u prugramma. U standard ùn regula micca u locu di sti schedari in ogni modu.

I prugrammi iniziati, secondu u standard, deve esse passatu almenu quattru variabili di l'ambiente:

  1. HOME - u cartulare di casa di l'utilizatori.
  2. LOGNAME - login d'utilizatore.
  3. PATH hè u percorsu induve pudete truvà utilità di u sistema standard.
  4. SHELL - percorsu à l'interprete di cumandamenti utilizatu.

In particulare, POSIX ùn dice nunda di induve venenu i valori per queste variabili.

Bestseller - Vixie cron 3.0pl1

L'antenatu cumuni di varianti cron populari hè Vixie cron 3.0pl1, introduttu in a mailing list comp.sources.unix in 1992. Avemu da cunsiderà e caratteristiche principali di sta versione in più detail.

Vixie cron vene in dui prugrammi (cron è crontab). Cum'è di solitu, u daemon hè rispunsevule per leghje è eseguisce i travaglii da a tavola di u travagliu di u sistema è di e tavule di l'utilizatori individuali, mentre chì l'utilità crontab hè rispunsevule per edità e tavule d'utilizatori.

Task table è schedarii di cunfigurazione

A tabella di attività di superuser si trova in /etc/crontab. A sintassi di a tabella di u sistema currisponde à a sintassi di Vixie cron, cù l'eccezzioni chì a sesta colonna indica u nome di l'utilizatore per quale u compitu hè lanciatu:

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

I tavulini di attività di l'utilizatori regulari sò situati in /var/cron/tabs/username è utilizanu a stessa sintassi. Quandu eseguite l'utilità crontab cum'è utilizatore, sò questi schedari chì sò editati.

I listi di l'utilizatori cù l'accessu à crontab sò gestiti in i schedari /var/cron/allow è /var/cron/deny, induve basta à inserisce u nome d'utilizatore in una linea separata.

Sintassi estesa

Comparatu à POSIX crontab, a suluzione di Paul Vixey cuntene parechje mudificazioni assai utili à a sintassi di e tavule di l'utilità.

Una nova sintassi di a tabella hè diventata dispunibule: per esempiu, pudete specificà i ghjorni di a settimana o i mesi per nome (lun, mar, etc.):

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

Pudete specificà u passu attraversu quale i travaglii sò lanciati:

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

Passi è intervalli ponu esse mischiati:

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

L'alternative intuitive à a sintassi abituale sò supportate (reboot, annuale, annually, monthly, weekly, daily, midnight, hourly):

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

Ambiente di Esecuzione di Task

Vixie cron permette di cambià l'ambiente di l'applicazioni in esecuzione.

E variabili di l'ambiente USER, LOGNAME è HOME ùn sò micca solu furnite da u demoniu, ma sò pigliati da u schedariu. passwd. A variabile PATH hè impostata à "/usr/bin:/bin" è a variabile SHELL hè impostata à "/bin/sh". I valori di tutte e variàbili eccettu LOGNAME ponu esse cambiati in e tavule d'utilizatori.

Alcune variabili di l'ambiente (principalmente SHELL è HOME) sò aduprate da cron stessu per inizià un compitu. Eccu ciò chì l'usu di bash invece di u sh predeterminatu per eseguisce i travaglii di l'utilizatori pò esse simile:

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

In ultimamente, tutte e variàbili di l'ambienti definite in a tavula (aduprate da cron o necessariu da u prucessu) seranu passate à u travagliu in esecuzione.

Per edità i schedari, crontab usa l'editore specificatu in a variabile d'ambiente VISUAL o EDITOR. Se l'ambiente induve crontab hè stata eseguita ùn hà micca definite sti variàbili, allora "/usr/ucb/vi" hè utilizatu (ucb hè probabilmente l'Università di California, Berkeley).

cron nantu à Debian è Ubuntu

I sviluppatori di Debian è distribuzioni derivate anu liberatu versione assai mudificata Vixie cron versione 3.0pl1. Ùn ci sò micca diffirenzii in a sintassi di i schedarii di tavulinu; per l'utilizatori, questu hè u stessu cron Vixie. Funzioni novi più grandi: Supportu syslog, SELinux и Pam.

Di i cambiamenti menu notevuli, ma tangibili - u locu di i schedarii di cunfigurazione è e tavule di u travagliu.

E tavule d'utilizatori in Debian sò situate in u cartulare /var/spool/cron/crontabs, a tabella di u sistema hè sempre quì - in /etc/crontab. I tabelli di compiti specifichi per i pacchetti Debian sò posti in /etc/cron.d, da quale u daemon cron li leghje automaticamente. U cuntrollu di l'accessu di l'utilizatori hè guvernatu da i schedari /etc/cron.allow è /etc/cron.deny.

A cunchiglia predeterminata hè sempre /bin/sh, chì in Debian hè una piccula cunchiglia cumpleta cù POSIX acquavita, lanciatu senza leghje alcuna cunfigurazione (in modu micca interattivu).

Cron stessu in l'ultime versioni di Debian hè lanciatu via systemd, è a cunfigurazione di lanciamentu pò esse vista in /lib/systemd/system/cron.service. Ùn ci hè nunda di spiciale in a cunfigurazione di u serviziu; ogni gestione di attività più sottile pò esse fatta per mezu di variabili di l'ambiente dichjarate direttamente in u crontab di ogni utilizatore.

cronie nantu à RedHat, Fedora è CentOS

amicu - fork di Vixie cron versione 4.1. Cum'è in Debian, a sintassi ùn hà micca cambiatu, ma aghjunghjenu supportu per PAM è SELinux, travagliendu in un cluster, monitoring files with inotify, è altre funziunalità.

A cunfigurazione predeterminata hè in i lochi di solitu: a tavola di u sistema hè in /etc/crontab, i pacchetti mettenu e so tavule in /etc/cron.d, e tavule d'utilizatori andate in /var/spool/cron/crontabs.

U daemon corre sottu systemd, a cunfigurazione di u serviziu hè /lib/systemd/system/crond.service.

In distribuzioni Red Hat-like, l'iniziu predeterminatu hè /bin/sh, chì hè u bash standard. Nota chì quandu eseguisce cron jobs via /bin/sh, u bash shell principia in modu POSIX-compliant è ùn leghje micca cunfigurazione addiziale, in esecuzione in modalità non interattiva.

cronie in SLES è openSUSE

A distribuzione SLES tedesca è u so derivatu openSUSE utilizanu u stessu cronie. U daemon quì funziona ancu sottu systemd, a cunfigurazione di u serviziu hè in /usr/lib/systemd/system/cron.service. Configurazione: /etc/crontab, /etc/cron.d, /var/spool/cron/tabs. /bin/sh hè a stessa bash in esecuzione in modu micca interattivu cumpletu POSIX.

Vixie cron dispusitivu

I discendenti muderni di cron ùn anu micca cambiatu radicali paragunatu à Vixie cron, ma anu ancu acquistatu novi funziunalità chì ùn sò micca obligati à capisce i principii di u prugramma. Parechje di sti estensioni sò pocu cuncepiti è cunfundenu u codice. U codice fonte cron originale di Paul Wixie hè un piacè di leghje.

Dunque, aghju decisu di analizà u cron device usendu l'esempiu di un prugramma cumunu à i dui rami di u sviluppu cron - Vixie cron 3.0pl1. Simplificheraghju l'esempii sguassendu ifdefs chì facenu a lettura difficiule è omettenu dettagli secundari.

U travagliu di u dimòniu pò esse divisu in parechje tappe:

  1. Inizializazione di u prugramma.
  2. Raccoglie è aghjurnà a lista di i travaglii da eseguisce.
  3. U travagliu di u ciclu cron principale.
  4. Cumincià un compitu.

Pigliemu in ordine.

Inizializazione

À l'iniziu, dopu avè verificatu l'argumenti di u prucessu, cron installate i gestori di signali SIGCHLD è SIGHUP. U primu registra una entrata nantu à a terminazione di u prucessu di u zitellu, u sicondu chjude u descrittore di u schedariu di u schedariu:

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

U cron daemon in u sistema sempre corre solu, solu in u rolu di superuser è da u cartulare cron principale. I seguenti chjamati creanu un schedariu di serratura cù u PID di u prucessu demoniu, assicuratevi chì l'utilizatore hè currettu, è cambiate u cartulare attuale à u cartulare principale:

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

U percorsu predeterminatu hè stabilitu, chì serà utilizatu à l'iniziu di prucessi:

setenv("PATH", _PATH_DEFPATH, 1);

Dopu, u prucessu hè "demonizatu": crea una copia di u zitellu di u prucessu chjamendu fork è una nova sessione in u prucessu di u zitellu (chjamendu setsid). U prucessu parent ùn hè più necessariu - è esce:

switch (fork()) {
case -1:
    /* критическая ошибка и завершение работы */
    exit(0);
break;
case 0:
    /* дочерний процесс */
    (void) setsid();
break;
default:
    /* родительский процесс завершает работу */
    _exit(0);
}

A terminazione di u prucessu parente libera a serratura nantu à u schedariu di serratura. Inoltre, avete bisognu di aghjurnà u PID in u schedariu à un zitellu. Dopu quì, a basa di dati di i travaglii hè cumpletu:

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

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

Allora cron passa à u ciclu di travagliu principale. Ma prima di quessa, vale a pena piglià un ochju à carica a lista di i travaglii.

Raccolta è aghjurnà a lista di u travagliu

A funzione load_database hè rispunsevuli di carricà a lista di i travaglii. Cuntrolla u crontab di u sistema principale è u cartulare di i fugliali d'utilizatori. Se i schedarii è u cartulare ùn anu micca cambiatu, allora a lista di i travaglii ùn hè micca relettu. Altrimenti, una nova lista di tarei principia à furmà.

Caricà un schedariu di sistema cù nomi di schedarii è tavulini speciali:

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

Caricà e tabelle d'utilizatori in un ciclu:

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

Dopu quì, a vechja basa di dati hè rimpiazzata da una nova.

In l'esempii sopra, a chjama à process_crontab verifica l'esistenza di un utilizatore chì currisponde à u nome di u schedariu di a tavula (a menu chì ùn hè u superuser) è poi chjama load_user. L'ultime leghje digià u schedariu stessu linea per linea:

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

Quì, o a variabile di l'ambiente hè stabilita (linee di a forma VAR = valore) utilizendu e funzioni load_env / env_set, o a descrizzione di u compitu hè lettu (* * * * * /path/to/exec) utilizendu a funzione load_entry.

L'entità di entrata chì load_entry torna hè u nostru compitu, chì si trova in a lista generale di i travaglii. In a funzione stessu, una parsing verbose di u formatu di u tempu hè realizatu, ma simu più interessate in a furmazione di variabili di l'ambienti è i paràmetri di lanciamentu di u travagliu:

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

Cù a lista attuale di i travaglii, u ciclu principale travaglia.

Loop principale

U cron uriginale da a Versione 7 Unix hà travagliatu abbastanza simplice: hà rilettu a cunfigurazione in un ciclu, hà iniziatu i travaglii di u minutu attuale cum'è u superuser, è dorme finu à u principiu di u prossimu minutu. Stu approcciu simplice nantu à e macchine più vechje necessitava troppu risorse.

In SysV, una versione alternativa hè stata pruposta induve u daemon dorme o finu à u minutu più vicinu per quale u compitu hè definitu, o per 30 minuti. Risorse per rileghje a cunfigurazione è cuntrollà i travaglii in questu modu cunsumanu menu, ma hè diventatu inconveniente per aghjurnà rapidamente a lista di i travaglii.

Vixie cron hà tornatu à verificà e liste di attività una volta per minutu, postu chì à a fine di l'anni 80 ci era assai più risorse nantu à e macchine Unix standard:

/* первичная загрузка задач */
load_database(&database);
/* запустить задачи, поставленные к выполнению после перезагрузки системы */
run_reboot_jobs(&database);
/* сделать TargetTime началом ближайшей минуты */
cron_sync();
while (TRUE) {
    /* выполнить задачи, после чего спать до TargetTime с поправкой на время, потраченное на задачи */
    cron_sleep();

    /* перечитать конфигурацию */
    load_database(&database);

    /* собрать задачи для данной минуты */
    cron_tick(&database);

    /* перевести TargetTime на начало следующей минуты */
    TargetTime += 60;
}

A funzione cron_sleep hè direttamente implicata in l'esekzione di i travaglii, chjamendu u job_runqueue (enumerate è eseguite e funzioni) è do_command (eseguite ogni compitu individuale). L'ultima funzione vale a pena analizà in più detail.

Eseguisce un compitu

A funzione do_command hè fatta in un bonu stile Unix, vale à dì, face una furchetta per eseguisce un compitu in modu asincronu. U prucessu parenti cuntinueghja à eseguisce e so attività, u prucessu di u zitellu prepara u prucessu di u travagliu:

switch (fork()) {
case -1:
    /*не смогли выполнить fork */
    break;
case 0:
    /* дочерний процесс: на всякий случай еще раз пробуем захватить главный лок */
    acquire_daemonlock(1);
    /* переходим к формированию процесса задачи */
    child_process(e, u);
    /* по завершению дочерний процесс заканчивает работу */
    _exit(OK_EXIT);
    break;
default:
    /* родительский процесс продолжает работу */
    break;
}

Ci hè assai di logica in child_process: pigghia l'output standard è i flussi d'errore nantu à ellu stessu, perchè pò esse mandatu à u mail (se a variabile di l'ambiente MAILTO hè specificatu in a tavola di u travagliu), è, infine, aspetta. per compie u prucessu principale di u compitu.

U prucessu di u travagliu hè furmatu da un altru forchetta:

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

Chì, in generale, hè tuttu u cron. Aghju omessi qualchi dettagli interessanti, per esempiu, cuntabili per l'utilizatori remoti, ma delineatu u principale.

Afterword

Cron hè un prugramma sorprendentemente simplice è utile, fattu in e migliori tradizioni di u mondu Unix. Ùn face nunda in più, ma hà fattu u so travagliu notevolmente dapoi parechji decennii. Pigliò menu di una ora per rivisione u codice per a versione chì vene cù Ubuntu, è aghju avutu assai piacè! Spergu ch'e aghju pussutu sparte cun voi.

Ùn sò micca cunnoscu di voi, ma sò un pocu tristu per capisce chì a prugrammazione muderna, cù a so tendenza à cumplicà è troppu astratta, ùn hè micca stata cunduce à una tale simplicità per un bellu pezzu.

Ci hè parechje alternative muderne à cron: systemd-timers permettenu di urganizà sistemi cumplessi cù dipendenze, fcron vi permette di regulà in modu più flexible u cunsumu di risorse per i travaglii. Ma personalmente, u crontab più simplice era sempre abbastanza per mè.

In corta, amate Unix, utilizate prugrammi simplici è ùn vi scurdate di leghje u mana per a vostra piattaforma!

Source: www.habr.com

Add a comment