Модуль 17

Crontab та розклад виконання

Ось готовий урок, створений у стилі CS50, спеціально для тебе. Вмикай уяву — ми починаємо!


🎓 CS50: Crontab та мистецтво керування часом

Вітаю, друзі!

1. 🔥 Вступ: проблема та мотивація

Уявіть собі таку ситуацію. Ви — системний адміністратор або розробник. У вас є база даних вашого чудового стартапу. Ця база — це ваше все: клієнти, замовлення, гроші. І ви чудово знаєте правило: "Немає бекапу (резервної копії) — немає даних".

Ви вирішуєте робити бекап щоночі о 3:00, коли навантаження на сервер мінімальне.

І тут виникає питання: Як ви будете це робити?

Чи будете ви ставити собі будильник на 02:55 щоночі? Прокидатися, протирати очі, відкривати ноутбук, вводити команду в термінал, чекати завершення і лягати спати? А потім знову завтра? І післязавтра?

Звучить як жах, чи не так?

Комп’ютери були створені, щоб позбавити нас від рутини, а не створювати її. Нам потрібен спосіб сказати серверу: "Слухай, ось тобі інструкція. Виконуй її щодня рівно о 3:00. І мене не турбуй, поки щось не зламається".

Саме для цього в Linux (та інших Unix-подібних системах) існує Cron. Це ваш особистий, найнадійніший асистент, який ніколи не спить і має маніакальну пристрасть до розкладів.


2. 🧠 Теоретична база: Що там "під капотом"?

Давайте розберемося з термінологією, але без зайвого пафосу.

  • Cron (від грец. Chronos — час) — це демон (фоновий процес), який запускається разом із системою і прокидається щохвилини.
  • Crontab (Cron table) — це власне "розклад". Це звичайний текстовий файл, де записано, що робити і коли робити.

Як це працює?

Уявіть собі Cron як охоронця, який кожну хвилину дивиться на свій годинник, а потім заглядає в список завдань (Crontab). Він запитує: "Зараз 14:05. Чи є у мене завдання на 14:05?" * Якщо є — він їх виконує. * Якщо ні — він чекає наступної хвилини.

Священні 5 зірочок

Найстрашніше для новачків — це синтаксис. Він виглядає як заклинання:

* * * * * /path/to/command

Що це за зірочки? Це координати часу. Їх обов'язково треба зрозуміти (але не зубрити, бо Google завжди поруч). Порядок такий:

  1. Хвилини (0–59)
  2. Години (0–23)
  3. День місяця (1–31)
  4. Місяць (1–12)
  5. День тижня (0–7, де 0 і 7 — це неділя)

Інтуїтивна підказка: Ми йдемо від найменшого до найбільшого (хвилини -> години -> дні...), а в кінці — уточнення дня тижня.

Якщо стоїть зірочка * — це означає "кожну одиницю цього часу" (кожну хвилину, кожну годину тощо).


3. 🧪 Приклади (від простого до реального)

Давайте подивимось на це в дії.

Приклад 1: "Набридливий асистент"

* * * * * echo "Я працюю!" >> /tmp/cron_log.txt

Питання до вас: Як часто цей рядок з'являтиметься у файлі? ... Відповідь: Щохвилини. Оскільки скрізь зірочки, Cron виконуватиме це в кожну хвилину, кожної години, кожного дня.


Приклад 2: Той самий нічний бекап

Ми хочемо запустити скрипт о 03:30 ночі кожного дня.

30 3 * * * /home/user/backup.sh

Розбір: * 30 — 30-та хвилина. * 3 — 3-тя година ночі. * * — будь-який день місяця. * * — будь-який місяць. * * — будь-який день тижня.

Вуаля! Ви спите, скрипт працює.


Приклад 3: Робочий ранок (Складніше!)

Уявіть, що нам треба запускати звіт тільки по буднях (з понеділка по п'ятницю) о 09:00 ранку.

Як би ви це написали? Подумайте секунду. ... Ось як це виглядає:

0 9 * * 1-5 /home/user/send_report.py

Чому так? * 0 9 — рівно о 09:00. * * * — число і місяць не важливі. * 1-5 — з понеділка (1) по п'ятницю (5).

Бачите логіку? Ви просто описуєте часові рамки.


Приклад 4: Кожні 15 хвилин

Іноді нам треба, щоб щось бігало часто. Наприклад, перевірка, чи працює сайт.

*/15 * * * * /home/user/check_site.sh

Слеш / означає "крок". Тобто "кожну 15-ту хвилину" (0, 15, 30, 45).


4. 🛠 Практична частина

Тепер ваша черга! Відкрийте термінал (або уявіть його). Команда для редагування: crontab -e (edit). Команда для перегляду: crontab -l (list).

Завдання:

  1. 🔹 Розминка: Напишіть правило, яке запускає команду date щогодини рівно в 15 хвилин (наприклад, 10:15, 11:15...).
  2. 🔹 Зміна умов: Змініть попереднє правило так, щоб воно працювало тільки у грудні.
  3. 🔹 Виправлення помилки: Студент написав: * 23 * * * script.sh, бажаючи запускати скрипт о 23:00. Що піде не так? (Підказка: подивіться на поле хвилин).
  4. 🔹 Реальний кейс: Вам треба очищати папку /tmp щонеділі опівночі. Напишіть рядок для Crontab.
  5. 🔹 А що, якщо... Що станеться, якщо ваш комп'ютер був вимкнений у той час, коли мало виконатися завдання? (Це питання на логіку).
  6. 🔹 Міні-кейс: Придумайте завдання, яке буде вітати вас повідомленням "Час обідати!" щодня о 13:00.

(Спробуйте записати відповіді десь собі, перш ніж читати далі!)


5. 💡 Мислення як у розробника

Як досвідчені інженери використовують Cron? Вони не просто пишуть команди. Вони передбачають проблеми.

Типова помилка новачка №1: Шляхи (Paths)

Ви пишете в терміналі python script.py, і все працює. Ви ставите це в Cron — і нічого не працює. Чому? Тому що Cron не знає, де лежить python, і не знає, де лежить script.py. Він живе у своєму маленькому світі.

Як думає профі: Завжди використовуйте абсолютні шляхи: ❌ 30 2 * * * python script.py30 2 * * * /usr/bin/python3 /home/david/project/script.py

Типова помилка №2: Куди зникає вивід?

Якщо ваш скрипт щось пише (print("Hello")), а Cron запускає його вночі — хто це побачить? Ніхто. Або система намагатиметься відправити вам локальний email, який ви ніколи не читаєте.

Як думає профі: Логування — це наше все. Перенаправляйте вивід у файл: ... command >> /var/log/my_app.log 2>&1 (2>&1 означає: записуй і звичайні повідомлення, і помилки в одне місце).

Лайфхак

Не намагайтеся бути героєм і рахувати дні тижня в голові. Використовуйте інструменти типу crontab.guru. Це сайт, де ви вводите зірочки, а він людською мовою пише, коли це спрацює. Це не соромно, це ефективно!


6. 🧩 Підсумок

Отже, що ми сьогодні зробили? 1. Зрозуміли, що Cron — це ваш надійний робот-планувальник. 2. Розібрали магію 5 зірочок (Хвилини -> Години -> Дні -> Місяці -> Тижні). 3. Навчилися писати завдання від простих "щохвилини" до складних розкладів. 4. Дізналися, чому абсолютні шляхи рятують життя.

Тепер ви можете автоматизувати бекапи, надсилання листів або навіть нагадування попити води. Ви звільнили свій мозок від рутини.

Тизер наступного уроку: Але стривайте... Cron чудово запускає задачі за розкладом. А що робити, якщо нам треба запустити програму (наприклад, веб-сервер), яка має працювати постійно, 24/7, і якщо вона впаде — сама перезапуститися? Cron тут безсилий. На наступному занятті ми поговоримо про Systemd та демонізацію процесів.

А поки — crontab -e і вперед до автоматизації! 🚀