Cron dina Linux: sajarah, pamakean sareng alat

Cron dina Linux: sajarah, pamakean sareng alat

Palasik wrote yén senang jam teu lalajo. Dina jaman liar éta henteu aya programer atanapi Unix, tapi ayeuna programer terang pasti: cron bakal ngalacak waktos tibatan aranjeunna.

Utiliti garis paréntah mangrupikeun kalemahan sareng tugas pikeun kuring. sed, awk, wc, cut jeung program heubeul sejenna dijalankeun ku Aksara dina server kami unggal poe. Seueur di antarana dirancang salaku tugas pikeun cron, penjadwal anu asalna ti taun 70an.

Pikeun lila kuring dipaké cron superficially, tanpa lebet kana detil, tapi hiji poé, nalika kuring encountered kasalahan nalika ngajalankeun skrip, Kuring mutuskeun pikeun nempo kana eta tuntas. Ieu kumaha tulisan ieu muncul, nalika nyerat kuring janten akrab sareng POSIX crontab, pilihan cron utama dina distribusi Linux populér sareng struktur sababaraha di antarana.

Naha anjeun nganggo Linux sareng ngajalankeun tugas cron? Naha anjeun resep arsitektur aplikasi sistem di Unix? Teras we nuju di jalan!

eusi

Asalna spésiés

Palaksanaan périodik tina program pangguna atanapi sistem mangrupikeun kabutuhan anu jelas dina sadaya sistem operasi. Ku alatan éta, programer sadar kabutuhan jasa anu ngamungkinkeun aranjeunna pikeun ngarencanakeun sareng ngaéksekusi tugas anu lami pisan.

Sistem operasi kawas Unix ngalacak asal-usulna ka Versi 7 Unix, dikembangkeun dina 70-an abad ka tukang di Bell Labs, kalebet ku Ken Thompson anu kasohor. Vérsi 7 Unix ogé kaasup cron, layanan pikeun rutin ngajalankeun tugas superuser.

Cron modéren has mangrupikeun program anu saderhana, tapi algoritma operasi tina versi aslina langkung saderhana: jasa éta hudang sakali menit, maca méja kalayan tugas tina hiji file (/etc/lib/crontab) sareng dilaksanakeun pikeun superuser tugas-tugas anu kedah dilaksanakeun dina waktos ayeuna.

Salajengna, vérsi anu langkung saé tina jasa anu sederhana sareng mangpaat disayogikeun sareng sadaya sistem operasi sapertos Unix.

Katerangan umum ngeunaan format crontab sareng prinsip dasar operasi utilitas kalebet kana standar utama sistem operasi sapertos Unix - POSIX - dina taun 1992, sahingga cron tina standar de facto janten standar de jure.

Dina 1987, Paul Vixie, sanggeus survey pamaké Unix ngeunaan kahayang maranéhna pikeun cron, ngarilis versi sejen tina daemon nu dilereskeun sababaraha masalah cron tradisional jeung dimekarkeun sintaksis file tabel.

Ku vérsi katilu Vixie cron mimiti minuhan sarat POSIX, sajaba, program ngabogaan lisénsi liberal, atawa rada teu aya lisénsi pisan, iwal kahayang dina README nu: pangarang teu méré jaminan, ngaran pangarang. teu bisa dihapus, sarta program ngan bisa dijual bareng jeung kode sumber. Sarat ieu tétéla cocog sareng prinsip parangkat lunak gratis anu janten popularitas dina taun-taun éta, ku kituna sababaraha distribusi Linux konci anu muncul dina awal 90an nyandak Vixie cron salaku sistemna sareng masih ngembangkeun ayeuna.

Khususna, Red Hat sareng SUSE ngembangkeun garpu Vixie cron - cronie, sareng Debian sareng Ubuntu nganggo édisi asli Vixie cron sareng seueur patch.

Hayu urang kenal sareng crontab utilitas pangguna anu dijelaskeun dina POSIX, saatos éta urang bakal ningali ekstensi sintaksis anu disayogikeun dina Vixie cron sareng panggunaan variasi Vixie cron dina distribusi Linux populér. Sarta pamustunganana, céri on jajan mangrupa analisis alat cron daemon.

POSIX crontab

Upami cron asli sok dianggo pikeun superuser, penjadwal modéren sering nganyahokeun tugas pangguna biasa, anu langkung aman sareng merenah.

Crons disayogikeun salaku sakumpulan dua program: daemon cron anu terus dijalankeun sareng utilitas crontab anu sayogi pikeun pangguna. Anu terakhir ngamungkinkeun anjeun ngédit tabel tugas khusus pikeun unggal pangguna dina sistem, sedengkeun daemon ngaluncurkeun tugas ti méja pangguna sareng sistem.

В standar POSIX paripolah daemon henteu dijelaskeun ku cara naon waé sareng ngan ukur program pangguna anu diformalkeun crontab. Ayana mékanisme pikeun ngaluncurkeun tugas pangguna, tangtosna, tersirat, tapi henteu dijelaskeun sacara rinci.

Ku nyauran utilitas crontab, anjeun tiasa ngalakukeun opat hal: ngédit méja tugas pangguna dina éditor, ngamuat méja tina file, nunjukkeun tabel tugas ayeuna, sareng mupus tabel tugas. Conto kumaha utilitas crontab jalan:

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

Nalika nelepon crontab -e redaktur dieusian dina variabel lingkungan baku bakal dipaké EDITOR.

Tugas sorangan dijelaskeun dina format ieu:

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

Lima widang mimiti rékaman: menit [1..60], jam [0..23], poé dina bulan [1..31], bulan [1..12], poé dina saminggu [0. .6], dimana 0 nyaéta Minggu. Panungtungan, kagenep, sawah nyaéta garis anu bakal dieksekusi ku juru paréntah standar.

Dina lima widang kahiji, nilai bisa didaptarkeun dipisahkeun ku koma:

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

Atawa nganggo tanda hubung:

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

Aksés pamaké kana jadwal tugas diatur dina POSIX ku cron.allow jeung cron.deny file, nu daptar pamaké kalawan aksés ka crontab sarta pamaké tanpa aksés ka program, masing-masing. Standar henteu ngatur lokasi file ieu ku cara naon waé.

Numutkeun standar, sahenteuna opat variabel lingkungan kedah disalurkeun ka program anu diluncurkeun:

  1. HOME - diréktori imah pamaké.
  2. LOGNAME - login pamaké.
  3. PATH mangrupikeun jalur dimana anjeun tiasa mendakan utilitas sistem standar.
  4. SHELL - jalur ka juru paréntah dipaké.

Utamana, POSIX nyarios nanaon ngeunaan dimana nilai-nilai variabel ieu asalna.

Pangalusna - Vixie cron 3.0pl1

Karuhun umum tina varian cron populér nyaéta Vixie cron 3.0pl1, diwanohkeun dina milis comp.sources.unix taun 1992. Urang bakal mertimbangkeun fitur utama versi ieu dina leuwih jéntré.

Vixie cron hadir dina dua program (cron sareng crontab). Sakumaha biasa, daemon tanggung jawab maca sareng ngajalankeun tugas tina tabel tugas sistem sareng tabel tugas pangguna individu, sareng utilitas crontab tanggung jawab pikeun ngédit tabel pangguna.

Tabel tugas sareng file konfigurasi

Tabel tugas superuser aya dina /etc/crontab. Sintaksis tabel sistem pakait sareng sintaksis Vixie cron, iwal ti kolom kagenep di jerona nunjukkeun nami pangguna anu ngawakilan tugasna diluncurkeun:

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

Tabel tugas pamaké biasa aya di /var/cron/tabs/username sareng nganggo sintaksis anu sami. Nalika anjeun ngajalankeun utilitas crontab salaku pangguna, ieu mangrupikeun file anu diédit.

Daptar pangguna anu gaduh aksés kana crontab diatur dina file /var/cron/allow sareng /var/cron/deny, dimana anjeun ngan ukur kedah ngalebetkeun nami pangguna dina jalur anu misah.

Sintaksis ngalegaan

Dibandingkeun sareng crontab POSIX, solusi Paul Vixey ngandung sababaraha modifikasi anu mangpaat pikeun sintaksis tabel tugas utiliti.

Sintaksis tabel anyar parantos sayogi: contona, anjeun tiasa netepkeun dinten dina minggu atanapi bulan dumasar nami (Sen, Sel, sareng saterasna):

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

Anjeun tiasa netepkeun léngkah pikeun ngaluncurkeun tugas:

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

Léngkah sareng interval tiasa dicampur:

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

Alternatif intuitif pikeun sintaksis biasa dirojong (reboot, taunan, taunan, bulanan, mingguan, sapopoé, tengah wengi, unggal jam):

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

Lingkungan palaksanaan tugas

Vixie cron ngidinan Anjeun pikeun ngarobah lingkungan ngajalankeun aplikasi.

Variabel lingkungan USER, LOGNAME sareng HOME henteu ngan ukur disayogikeun ku daemon, tapi dicandak tina file. passwd. Variabel PATH disetel ka "/ usr / bin: / bin" jeung variabel SHELL disetel ka "/ bin / sh". Nilai sadaya variabel iwal LOGNAME tiasa dirobih dina tabel pangguna.

Sababaraha variabel lingkungan (utamana SHELL sareng HOME) dianggo ku cron sorangan pikeun ngajalankeun tugas. Ieu naon anu nganggo bash tinimbang standar sh pikeun ngajalankeun tugas khusus sigana sapertos:

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

Pamustunganana, sadaya variabel lingkungan anu didefinisikeun dina tabél (dipaké ku cron atanapi diperyogikeun ku prosés) bakal dialihkeun kana tugas anu dijalankeun.

Pikeun ngédit file, crontab nganggo éditor anu ditangtukeun dina variabel lingkungan VISUAL atanapi EDITOR. Upami lingkungan dimana crontab dijalankeun teu gaduh variabel ieu, maka "/usr/ucb/vi" dianggo (ucb sigana Universitas California, Berkeley).

cron on Debian sareng Ubuntu

Pamekar Debian sareng distribusi turunan parantos dileupaskeun Vérsi kacida dirobah Vixie cron Vérsi 3.0pl1. Henteu aya bédana dina sintaksis file méja; pikeun pangguna éta mangrupikeun cron Vixie anu sami. Pangbadagna Fitur Anyar: Rojongan syslog, SELinux и Pam.

Kurang noticeable, tapi parobahan tangible kaasup lokasi file konfigurasi na tabel tugas.

Méja pamaké di Debian aya dina diréktori /var/spool/cron/crontabs, tabel sistem masih aya - dina /etc/crontab. Debian tabel tugas pakét-spésifik disimpen dina /etc/cron.d, ti mana daemon cron otomatis maca aranjeunna. Kontrol aksés pamaké dikawasa ku file /etc/cron.allow jeung /etc/cron.deny.

Cangkang standar masih / bin / sh, anu dina Debian mangrupikeun cangkang anu patuh POSIX leutik dash, diluncurkeun tanpa maca konfigurasi naon waé (dina modeu non-interaktif).

Cron sorangan dina versi panganyarna tina Debian diluncurkeun via systemd, sareng konfigurasi peluncuran tiasa ditingali dina /lib/systemd/system/cron.service. Henteu aya anu khusus dina konfigurasi jasa; manajemén tugas anu langkung halus tiasa dilakukeun ngaliwatan variabel lingkungan anu dinyatakeun langsung dina crontab unggal pangguna.

cronie on RedHat, Fedora jeung CentOS

kroni - garpu Vixie cron versi 4.1. Sapertos dina Debian, sintaksisna henteu robih, tapi dukungan pikeun PAM sareng SELinux, damel di klaster, nyukcruk file nganggo inotify sareng fitur-fitur sanésna parantos ditambah.

Konfigurasi standar aya di tempat biasa: tabel sistem aya dina /etc/crontab, bungkusan nempatkeun tabel maranéhanana di /etc/cron.d, tabel pamaké asup /var/spool/cron/crontabs.

Daemon dijalankeun dina kontrol systemd, konfigurasi jasa nyaéta /lib/systemd/system/crond.service.

Dina distribusi sapertos Red Hat, /bin/sh dianggo sacara standar nalika ngamimitian, anu mangrupikeun bash standar. Ieu kudu dicatet yén nalika ngajalankeun jobs cron via / bin / sh, cangkang bash dimimitian dina mode POSIX-patuh tur teu maca sagala konfigurasi tambahan, ngajalankeun dina modeu non-interaktif.

cronie di SLES sareng openSUSE

Distribusi Jerman SLES sareng turunan openSUSE nganggo cronie anu sami. Daemon di dieu ogé diluncurkeun dina systemd, konfigurasi jasa aya di /usr/lib/systemd/system/cron.service. Konfigurasi: /etc/crontab, /etc/cron.d, /var/spool/cron/tabs. / bin / sh teh bash sarua ngajalankeun dina mode non-interaktif POSIX-patuh.

alat Vixie cron

Turunan modern cron teu robah radikal dibandingkeun Vixie cron, tapi masih kaala fitur anyar nu teu diperlukeun pikeun ngarti prinsip program. Loba ekstensi ieu kirang dirancang jeung ngalieurkeun kode. Kode sumber cron asli ku Paul Vixey mangrupikeun karesep maca.

Ku alatan éta, kuring mutuskeun pikeun nganalisis alat cron ngagunakeun conto program cron umum pikeun duanana cabang pangwangunan - Vixie cron 3.0pl1. Kuring bakal simplify conto ku nyoplokkeun ifdefs nu ngahesekeun bacaan sarta omitting rinci minor.

Karya sétan bisa dibagi kana sababaraha tahapan:

  1. Inisialisasi program.
  2. Ngumpulkeun sareng ngapdet daptar tugas anu kedah dijalankeun.
  3. Main cron loop ngajalankeun.
  4. Mimitian tugas.

Hayu urang nempo aranjeunna dina urutan.

Initialisasi

Nalika dimimitian, saatos mariksa argumen prosés, cron masang panangan sinyal SIGCHLD sareng SIGHUP. Anu kahiji ngadamel éntri log ngeunaan ngeureunkeun prosés anak, anu kadua nutup deskriptor file tina file log:

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

Daemon cron sok ngajalankeun nyalira dina sistem, ngan salaku superuser sareng tina diréktori cron utama. Telepon di handap ieu nyiptakeun file konci sareng PID tina prosés daemon, pastikeun yén pangguna leres sareng robih diréktori ayeuna ka anu utama:

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

Jalur standar disetel, anu bakal dianggo nalika ngamimitian prosés:

setenv("PATH", _PATH_DEFPATH, 1);

Lajeng prosés "daemonized": nyiptakeun salinan anak prosés ku nelepon garpu jeung sési anyar dina prosés anak (nelepon setsid). Proses indungna henteu diperyogikeun deui, sareng kaluar:

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

Terminasi prosés indungna ngaleupaskeun konci dina file konci. Sajaba ti éta, diperlukeun pikeun ngapdet PID dina file ka anak. Saatos ieu, pangkalan data tugas dieusian:

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

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

Lajeng cron ngaléngkah ka siklus gawé utama. Tapi saencan éta, éta patut nyandak katingal dina ngamuat daptar tugas.

Ngumpulkeun sareng ngapdet daptar tugas

Fungsi load_database tanggung jawab pikeun ngamuat daptar tugas. Éta pariksa crontab sistem utama sareng diréktori sareng file pangguna. Upami file sareng diréktori henteu robih, daptar tugas henteu dibaca deui. Upami teu kitu, daptar tugas anyar mimiti ngabentuk.

Ngamuat file sistem sareng file sareng nami tabel khusus:

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

Ngamuat tabel pamaké dina loop a:

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

Sanggeus éta database heubeul diganti ku nu anyar.

Dina conto di luhur, fungsi process_crontab nelepon verifies yén pamaké cocog ngaran file tabel aya (iwal éta superuser a) lajeng nelepon load_user. Anu terakhir parantos maca file sorangan baris demi baris:

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

Di dieu, boh variabel lingkungan diatur (garis tina formulir VAR = nilai) ngagunakeun load_env / env_set fungsi, atawa pedaran tugas dibaca (* * * * * /path/to/exec) ngagunakeun fungsi load_entry.

Éntitas éntri anu dipulangkeun load_entry nyaéta tugas urang, anu disimpen dina daptar tugas umum. Fungsina sorangan ngalaksanakeun parsing verbose tina format waktos, tapi urang langkung resep kana formasi variabel lingkungan sareng parameter peluncuran tugas:

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

Gelung utama tiasa dianggo sareng daptar tugas ayeuna.

Loop utama

Cron aslina tina Vérsi 7 Unix digawé cukup basajan: eta ulang maca konfigurasi dina loop a, ngaluncurkeun tugas menit ayeuna salaku superuser, sarta saré nepi ka mimiti menit salajengna. Ieu pendekatan basajan dina mesin heubeul merlukeun loba teuing sumberdaya.

Versi alternatif diajukeun dina SysV, dimana daemon saré boh dugi ka menit anu pangcaketna dimana tugasna ditetepkeun, atanapi salami 30 menit. Pangsaeutikna sumber anu dikonsumsi pikeun maca ulang konfigurasi sareng mariksa tugas dina modeu ieu, tapi gancang ngamutahirkeun daptar tugas janten teu pikaresepeun.

Vixie cron balik deui ka mariksa daptar tugas sakali menit, untungna dina ahir taun 80-an aya langkung seueur sumber daya dina mesin Unix standar:

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

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

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

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

Fungsi cron_sleep ieu langsung aub dina executing tugas, nelepon job_runqueue (enumerate tur ngajalankeun tugas) jeung do_command (ngajalankeun unggal tugas individu) fungsi. Fungsi panungtungan sia examining di leuwih jéntré.

Ngajalankeun tugas

Fungsi do_command dieksekusi dina gaya Unix anu saé, nyaéta, éta garpu pikeun ngalaksanakeun tugas sacara asynchronously. Prosés indungna terus ngajalankeun tugas, prosés anak nyiapkeun prosés tugas:

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

Aya cukup loba logika di child_process: butuh kaluaran baku sarta kasalahan ngalirkeun kana sorangan, guna lajeng ngirim ka mail (lamun variabel lingkungan MAILTO dieusian dina tabel tugas), sarta, tungtungna, ngantosan nu utama. prosés tugas pikeun ngalengkepan.

Prosés tugas dibentuk ku garpu sejen:

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

Éta dasarna sadayana cron. Kuring disingkahkeun sababaraha rinci metot, contona, akuntansi pikeun pamaké jauh, tapi outlined hal utama.

afterword

Cron mangrupikeun program anu saderhana sareng mangpaat, dilakukeun dina tradisi pangsaéna tina dunya Unix. Anjeunna henteu ngalakukeun nanaon tambahan, tapi anjeunna parantos ngalaksanakeun tugasna saé pikeun sababaraha dekade ayeuna. Ngaliwatan kodeu pikeun versi nu hadir kalawan Ubuntu nyandak teu leuwih ti sajam, sarta kuring kungsi loba senang! Kuring miharep kuring bisa babagi eta sareng anjeun.

Kuring henteu weruh ngeunaan anjeun, tapi kuring rada hanjelu mun nyadar yén programming modern, kalawan kacenderungan -na pikeun leuwih-nyusahkeun tur over-abstrak, geus teu kondusif pikeun kesederhanaan misalna pikeun lila.

Aya seueur alternatif modéren pikeun cron: systemd-timers ngamungkinkeun anjeun pikeun ngatur sistem anu kompleks sareng dependensi, fcron ngamungkinkeun anjeun langkung fleksibel ngatur konsumsi sumberdaya ku tugas. Tapi sacara pribadi, crontab pangbasajanna sok cekap pikeun kuring.

Pondokna, cinta Unix, make program basajan tur ulah poho maca mana pikeun platform Anjeun!

sumber: www.habr.com

Tambahkeun komentar