Cron dalam Linux: sejarah, penggunaan dan peranti

Cron dalam Linux: sejarah, penggunaan dan peranti

Klasik menulis bahawa waktu gembira jangan menonton. Pada masa liar itu tidak ada pengaturcara mahupun Unix, tetapi hari ini pengaturcara tahu dengan pasti: cron akan menjejaki masa dan bukannya mereka.

Utiliti baris arahan adalah kelemahan dan tugas untuk saya. sed, awk, wc, cut dan program lama yang lain dijalankan oleh skrip pada pelayan kami setiap hari. Kebanyakannya direka bentuk sebagai tugas untuk cron, penjadual yang asalnya dari tahun 70-an.

Untuk masa yang lama saya menggunakan cron secara cetek, tanpa memasukkan butiran, tetapi suatu hari, apabila saya menghadapi ralat semasa menjalankan skrip, saya memutuskan untuk melihatnya dengan teliti. Beginilah cara artikel ini muncul, semasa menulisnya, saya mengenali POSIX crontab, pilihan cron utama dalam pengedaran Linux yang popular dan struktur sebahagian daripadanya.

Adakah anda menggunakan Linux dan menjalankan tugas cron? Adakah anda berminat dengan seni bina aplikasi sistem dalam Unix? Kemudian kami dalam perjalanan!

Содержание

Asal spesies

Pelaksanaan berkala bagi program pengguna atau sistem adalah satu keperluan yang jelas dalam semua sistem pengendalian. Oleh itu, pengaturcara menyedari keperluan untuk perkhidmatan yang membolehkan mereka merancang dan melaksanakan tugas secara berpusat sejak dahulu lagi.

Sistem pengendalian seperti Unix mengesan asal-usulnya kembali ke Versi 7 Unix, yang dibangunkan pada 70-an abad yang lalu di Bell Labs, termasuk oleh Ken Thompson yang terkenal. Versi 7 Unix juga termasuk cron, perkhidmatan untuk menjalankan tugas superuser secara kerap.

Cron moden yang tipikal ialah program yang mudah, tetapi algoritma pengendalian versi asal adalah lebih mudah: perkhidmatan bangun sekali seminit, membaca jadual dengan tugasan daripada satu fail (/etc/lib/crontab) dan dilakukan untuk superuser tugasan yang sepatutnya dilakukan pada masa semasa.

Selepas itu, versi perkhidmatan mudah dan berguna yang dipertingkatkan telah dibekalkan dengan semua sistem pengendalian seperti Unix.

Penerangan umum tentang format crontab dan prinsip asas operasi utiliti telah dimasukkan ke dalam standard utama sistem pengendalian seperti Unix - POSIX - pada tahun 1992, dan dengan itu cron daripada standard de facto menjadi standard de jure.

Pada tahun 1987, Paul Vixie, setelah meninjau pengguna Unix tentang keinginan mereka untuk cron, mengeluarkan versi lain daemon yang membetulkan beberapa masalah cron tradisional dan mengembangkan sintaks fail jadual.

Dengan versi ketiga Vixie cron mula memenuhi keperluan POSIX, di samping itu, program ini mempunyai lesen liberal, atau lebih tepatnya tidak ada lesen sama sekali, kecuali untuk kehendak dalam README: penulis tidak memberi jaminan, nama pengarang tidak boleh dipadamkan, dan program hanya boleh dijual bersama dengan kod sumber. Keperluan ini ternyata serasi dengan prinsip perisian percuma yang semakin popular pada tahun-tahun itu, jadi beberapa pengedaran Linux utama yang muncul pada awal 90-an menjadikan Vixie cron sebagai sistem mereka dan masih membangunkannya hari ini.

Khususnya, Red Hat dan SUSE membangunkan garpu Vixie cron - cronie, dan Debian dan Ubuntu menggunakan edisi asal Vixie cron dengan banyak tampalan.

Mari mula-mula berkenalan dengan crontab utiliti pengguna yang diterangkan dalam POSIX, selepas itu kita akan melihat sambungan sintaks yang disediakan dalam Vixie cron dan penggunaan variasi Vixie cron dalam pengedaran Linux yang popular. Dan akhirnya, ceri pada kek adalah analisis peranti daemon cron.

POSIX crontab

Jika cron asal sentiasa berfungsi untuk pengguna super, penjadual moden sering menangani tugas pengguna biasa, yang lebih selamat dan mudah.

Crons dibekalkan sebagai satu set dua program: daemon cron yang sentiasa berjalan dan utiliti crontab tersedia untuk pengguna. Yang terakhir membolehkan anda mengedit jadual tugas khusus untuk setiap pengguna dalam sistem, manakala daemon melancarkan tugas daripada jadual pengguna dan sistem.

В standard POSIX tingkah laku daemon tidak diterangkan dalam apa-apa cara dan hanya program pengguna diformalkan crontab. Kewujudan mekanisme untuk melancarkan tugas pengguna, sudah tentu, tersirat, tetapi tidak diterangkan secara terperinci.

Dengan memanggil utiliti crontab, anda boleh melakukan empat perkara: edit jadual tugas pengguna dalam editor, muatkan jadual daripada fail, tunjukkan jadual tugas semasa dan kosongkan jadual tugas. Contoh cara utiliti crontab berfungsi:

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

Apabila memanggil crontab -e editor yang dinyatakan dalam pembolehubah persekitaran standard akan digunakan EDITOR.

Tugasan itu sendiri diterangkan dalam format berikut:

# строки-комментарии игнорируются
#
# задача, выполняемая ежеминутно
* * * * * /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 medan pertama rekod: minit [1..60], jam [0..23], hari dalam bulan [1..31], bulan [1..12], hari dalam seminggu [0. .6], dengan 0 ialah Ahad. Medan terakhir, keenam, ialah baris yang akan dilaksanakan oleh penterjemah arahan standard.

Dalam lima medan pertama, nilai boleh disenaraikan dipisahkan dengan koma:

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

Atau dengan tanda sempang:

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

Akses pengguna kepada penjadualan tugas dikawal dalam POSIX oleh fail cron.allow dan cron.deny, yang menyenaraikan pengguna dengan akses kepada crontab dan pengguna tanpa akses kepada program, masing-masing. Piawaian tidak mengawal lokasi fail ini dalam apa cara sekalipun.

Mengikut piawaian, sekurang-kurangnya empat pembolehubah persekitaran mesti dihantar ke program yang dilancarkan:

  1. HOME - direktori rumah pengguna.
  2. LOGNAME — log masuk pengguna.
  3. PATH ialah laluan di mana anda boleh mencari utiliti sistem standard.
  4. SHELL — laluan ke penterjemah arahan yang digunakan.

Terutama, POSIX tidak mengatakan apa-apa tentang dari mana nilai untuk pembolehubah ini berasal.

Paling laris - Vixie cron 3.0pl1

Nenek moyang biasa bagi varian cron popular ialah Vixie cron 3.0pl1, yang diperkenalkan dalam senarai mel comp.sources.unix pada tahun 1992. Kami akan mempertimbangkan ciri utama versi ini dengan lebih terperinci.

Vixie cron datang dalam dua program (cron dan crontab). Seperti biasa, daemon bertanggungjawab untuk membaca dan menjalankan tugas daripada jadual tugas sistem dan jadual tugas pengguna individu, dan utiliti crontab bertanggungjawab untuk mengedit jadual pengguna.

Jadual tugas dan fail konfigurasi

Jadual tugas superuser terletak di /etc/crontab. Sintaks jadual sistem sepadan dengan sintaks Vixie cron, dengan pengecualian lajur keenam di dalamnya menunjukkan nama pengguna di bawahnya tugas itu dilancarkan:

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

Jadual tugas pengguna biasa terletak dalam /var/cron/tabs/nama pengguna dan menggunakan sintaks yang sama. Apabila anda menjalankan utiliti crontab sebagai pengguna, ini ialah fail yang diedit.

Senarai pengguna yang mempunyai akses kepada crontab diuruskan dalam fail /var/cron/allow dan /var/cron/deny, di mana anda hanya perlu memasukkan nama pengguna dalam baris yang berasingan.

Sintaks lanjutan

Berbanding dengan crontab POSIX, penyelesaian Paul Vixey mengandungi beberapa pengubahsuaian yang sangat berguna kepada sintaks jadual tugas utiliti.

Sintaks jadual baharu telah tersedia: contohnya, anda boleh menentukan hari dalam seminggu atau bulan mengikut nama (Isnin, Sel dan seterusnya):

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

Anda boleh menentukan langkah melalui mana tugasan dilancarkan:

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

Langkah dan selang boleh dicampur:

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

Alternatif intuitif kepada sintaks biasa disokong (but semula, tahunan, tahunan, bulanan, mingguan, harian, tengah malam, setiap jam):

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

Persekitaran pelaksanaan tugas

Vixie cron membolehkan anda menukar persekitaran aplikasi yang sedang berjalan.

Pembolehubah persekitaran USER, LOGNAME dan HOME tidak hanya disediakan oleh daemon, tetapi diambil daripada fail passwd. Pembolehubah PATH ditetapkan kepada "/usr/bin:/bin" dan pembolehubah SHELL ditetapkan kepada "/bin/sh". Nilai semua pembolehubah kecuali LOGNAME boleh ditukar dalam jadual pengguna.

Sesetengah pembolehubah persekitaran (terutamanya SHELL dan HOME) digunakan oleh cron sendiri untuk menjalankan tugas. Inilah yang mungkin kelihatan seperti menggunakan bash dan bukannya sh standard untuk menjalankan tugas tersuai:

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

Akhirnya, semua pembolehubah persekitaran yang ditakrifkan dalam jadual (digunakan oleh cron atau diperlukan oleh proses) akan dihantar ke tugas yang sedang dijalankan.

Untuk mengedit fail, crontab menggunakan editor yang ditentukan dalam pembolehubah persekitaran VISUAL atau EDITOR. Jika persekitaran tempat crontab dijalankan tidak mempunyai pembolehubah ini ditakrifkan, maka "/usr/ucb/vi" digunakan (ucb mungkin Universiti California, Berkeley).

cron pada Debian dan Ubuntu

Pembangun Debian dan pengedaran derivatif telah dikeluarkan versi yang sangat diubah suai Vixie cron versi 3.0pl1. Tiada perbezaan dalam sintaks fail jadual; untuk pengguna ia adalah cron Vixie yang sama. Ciri Baharu Terbesar: Sokongan syslog, SELinux и PAM.

Perubahan yang kurang ketara, tetapi ketara termasuk lokasi fail konfigurasi dan jadual tugas.

Jadual pengguna dalam Debian terletak dalam direktori /var/spool/cron/crontabs, jadual sistem masih ada - dalam /etc/crontab. Jadual tugas khusus pakej Debian diletakkan dalam /etc/cron.d, dari mana daemon cron membacanya secara automatik. Kawalan akses pengguna dikawal oleh fail /etc/cron.allow dan /etc/cron.deny.

Cangkang lalai masih /bin/sh, yang dalam Debian ialah cangkerang kecil yang mematuhi POSIX dash, dilancarkan tanpa membaca sebarang konfigurasi (dalam mod bukan interaktif).

Cron sendiri dalam versi terkini Debian dilancarkan melalui systemd, dan konfigurasi pelancaran boleh dilihat dalam /lib/systemd/system/cron.service. Tiada apa-apa yang istimewa dalam konfigurasi perkhidmatan; sebarang pengurusan tugas yang lebih halus boleh dilakukan melalui pembolehubah persekitaran yang diisytiharkan terus dalam crontab setiap pengguna.

kroni di RedHat, Fedora dan CentOS

cronie — garpu Vixie cron versi 4.1. Seperti dalam Debian, sintaks tidak berubah, tetapi sokongan untuk PAM dan SELinux, bekerja dalam kelompok, menjejaki fail menggunakan inotify dan ciri-ciri lain telah ditambah.

Konfigurasi lalai adalah di tempat biasa: jadual sistem berada dalam /etc/crontab, pakej meletakkan jadualnya dalam /etc/cron.d, jadual pengguna masuk /var/spool/cron/crontabs.

Daemon berjalan di bawah kawalan systemd, konfigurasi perkhidmatan ialah /lib/systemd/system/crond.service.

Pada pengedaran seperti Red Hat, /bin/sh digunakan secara lalai semasa permulaan, iaitu bash standard. Perlu diingat bahawa apabila menjalankan kerja cron melalui /bin/sh, shell bash bermula dalam mod patuh POSIX dan tidak membaca sebarang konfigurasi tambahan, berjalan dalam mod tidak interaktif.

kroni dalam SLES dan openSUSE

Pengedaran Jerman SLES dan terbitan openSUSE menggunakan kroni yang sama. Daemon di sini juga dilancarkan di bawah systemd, konfigurasi perkhidmatan terletak di /usr/lib/systemd/system/cron.service. Konfigurasi: /etc/crontab, /etc/cron.d, /var/spool/cron/tabs. /bin/sh ialah bash yang sama berjalan dalam mod tidak interaktif yang mematuhi POSIX.

Peranti vixie cron

Keturunan cron moden tidak berubah secara radikal berbanding dengan Vixie cron, tetapi masih memperoleh ciri baharu yang tidak diperlukan untuk memahami prinsip program. Kebanyakan sambungan ini direka bentuk dengan buruk dan mengelirukan kod. Kod sumber cron asal oleh Paul Vixey senang dibaca.

Oleh itu, saya memutuskan untuk menganalisis peranti cron menggunakan contoh program cron biasa untuk kedua-dua cabang pembangunan - Vixie cron 3.0pl1. Saya akan memudahkan contoh dengan mengalih keluar ifdefs yang merumitkan pembacaan dan meninggalkan butiran kecil.

Kerja syaitan boleh dibahagikan kepada beberapa peringkat:

  1. Permulaan program.
  2. Mengumpul dan mengemas kini senarai tugasan untuk dijalankan.
  3. Gelung cron utama berjalan.
  4. Mulakan tugasan.

Mari kita lihat mereka dalam susunan.

Permulaan

Apabila dimulakan, selepas menyemak argumen proses, cron memasang pengendali isyarat SIGCHLD dan SIGHUP. Yang pertama membuat entri log tentang penamatan proses anak, yang kedua menutup deskriptor fail fail log:

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

Daemon cron sentiasa berjalan bersendirian pada sistem, hanya sebagai pengguna super dan dari direktori cron utama. Panggilan berikut mencipta fail kunci dengan PID proses daemon, pastikan pengguna betul dan tukar direktori semasa kepada yang utama:

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

Laluan lalai ditetapkan, yang akan digunakan semasa memulakan proses:

setenv("PATH", _PATH_DEFPATH, 1);

Kemudian proses itu "daemonized": ia mencipta salinan kanak-kanak proses dengan memanggil fork dan sesi baharu dalam proses anak (memanggil setsid). Proses induk tidak lagi diperlukan, dan ia keluar:

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

Penamatan proses induk melepaskan kunci pada fail kunci. Di samping itu, ia dikehendaki mengemas kini PID dalam fail kepada kanak-kanak. Selepas ini, pangkalan data tugas diisi:

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

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

Kemudian cron bergerak ke kitaran kerja utama. Tetapi sebelum itu, ia patut melihat memuatkan senarai tugas.

Mengumpul dan mengemas kini senarai tugas

Fungsi load_database bertanggungjawab untuk memuatkan senarai tugas. Ia menyemak crontab sistem utama dan direktori dengan fail pengguna. Jika fail dan direktori tidak berubah, senarai tugas tidak dibaca semula. Jika tidak, senarai tugasan baharu mula terbentuk.

Memuatkan fail sistem dengan fail khas dan nama jadual:

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

Memuatkan jadual pengguna dalam gelung:

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

Selepas itu pangkalan data lama digantikan dengan yang baru.

Dalam contoh di atas, panggilan fungsi process_crontab mengesahkan bahawa pengguna yang sepadan dengan nama fail jadual wujud (melainkan ia adalah pengguna super) dan kemudian memanggil load_user. Yang terakhir sudah membaca fail itu sendiri 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 sini, sama ada pembolehubah persekitaran ditetapkan (baris dalam bentuk VAR=value) menggunakan fungsi load_env / env_set, atau penerangan tugas dibaca (* * * * * /path/to/exec) menggunakan fungsi load_entry.

Entiti kemasukan yang load_entry kembalikan ialah tugas kami, yang diletakkan dalam senarai umum tugas. Fungsi itu sendiri menjalankan penghuraian verbose format masa, tetapi kami lebih berminat dalam pembentukan pembolehubah persekitaran dan parameter pelancaran 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 berfungsi dengan senarai tugas semasa.

Gelung Utama

Cron asal daripada Versi 7 Unix berfungsi dengan mudah: ia membaca semula konfigurasi dalam gelung, melancarkan tugas minit semasa sebagai pengguna super, dan tidur sehingga permulaan minit seterusnya. Pendekatan mudah pada mesin lama ini memerlukan terlalu banyak sumber.

Versi alternatif telah dicadangkan dalam SysV, di mana daemon pergi tidur sama ada sehingga minit terdekat yang tugas itu ditakrifkan, atau selama 30 minit. Lebih sedikit sumber telah digunakan untuk membaca semula konfigurasi dan menyemak tugasan dalam mod ini, tetapi mengemas kini senarai tugasan dengan cepat menjadi menyusahkan.

Vixie cron kembali menyemak senarai tugasan sekali seminit, mujurlah pada penghujung tahun 80-an terdapat lebih banyak sumber pada mesin 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;
}

Fungsi cron_sleep terlibat secara langsung dalam melaksanakan tugas, memanggil fungsi job_runqueue (menghitung dan menjalankan tugas) dan do_command (menjalankan setiap tugas individu). Fungsi terakhir patut dikaji dengan lebih terperinci.

Menjalankan tugas

Fungsi do_command dilaksanakan dalam gaya Unix yang baik, iaitu, ia melakukan garpu untuk melaksanakan tugas secara tidak segerak. Proses induk terus melancarkan tugas, proses anak menyediakan proses tugas:

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

Terdapat banyak logik dalam child_process: ia memerlukan output standard dan aliran ralat ke dalam dirinya sendiri, untuk kemudian menghantarnya ke mel (jika pembolehubah persekitaran MAILTO dinyatakan dalam jadual tugas), dan, akhirnya, menunggu untuk utama proses tugasan untuk diselesaikan.

Proses tugas dibentuk oleh garpu lain:

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

Itu pada dasarnya semua cron. Saya meninggalkan beberapa butiran menarik, sebagai contoh, perakaunan untuk pengguna jauh, tetapi saya menggariskan perkara utama.

afterword

Cron ialah program yang sangat mudah dan berguna, dibuat dalam tradisi terbaik dunia Unix. Dia tidak melakukan apa-apa tambahan, tetapi dia telah melakukan tugasnya dengan hebat selama beberapa dekad sekarang. Memahami kod untuk versi yang disertakan dengan Ubuntu mengambil masa tidak lebih daripada satu jam, dan saya berasa sangat seronok! Saya harap saya dapat berkongsi dengan anda.

Saya tidak tahu tentang anda, tetapi saya agak sedih apabila menyedari bahawa pengaturcaraan moden, dengan kecenderungan untuk terlalu rumit dan terlalu abstrak, tidak kondusif untuk kesederhanaan sedemikian untuk masa yang lama.

Terdapat banyak alternatif moden untuk cron: systemd-timer membolehkan anda mengatur sistem yang kompleks dengan kebergantungan, fcron membolehkan anda mengawal penggunaan sumber dengan lebih fleksibel mengikut tugasan. Tetapi secara peribadi, crontab paling mudah sentiasa mencukupi untuk saya.

Pendek kata, suka Unix, gunakan program mudah dan jangan lupa baca mana untuk platform anda!

Sumber: www.habr.com

Tambah komen