Модуль 21

Cron та планування задач

Ось урок на тему "Cron та планування задач", згенерований у стилі David Malan / CS50 спеціально для тебе.


🕰️ Cron: Як підкорити час у Linux

Привіт, друзі! Ласкаво просимо. Це CS50, і сьогодні ми поговоримо про дещо фундаментальне.

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

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

Але як ви це робите? Ви ставите будильник на 3-тю годину ночі, прокидаєтеся, вмикаєте ноутбук, заходите на сервер і запускаєте скрипт копіювання? І так щодня?

Звісно, ні. Це було б божевіллям, чи не так?

Або інший приклад: уявіть, що ви власник інтернет-магазину, і вам потрібно щопонеділка надсилати клієнтам дайджест новин. Ви будете надсилати їх вручну кожному з тисячі клієнтів?

Світ IT тримається на автоматизації. Ми хочемо написати код один раз і дозволити машині виконувати рутинну роботу за нас. Нам потрібен надійний "будильник" всередині операційної системи, який ніколи не спить і точно знає, коли натиснути кнопку "Пуск".

Сьогодні ми розберемося з інструментом, який робить саме це. Зустрічайте — Cron. Без нього сучасний інтернет просто зупинився б.


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

Слово Cron походить від грецького Chronos (час).

Якщо зовсім просто: Cron — це планувальник задач. Це така маленька програмка (демон), яка працює у фоновому режимі вашої системи (Linux/Unix). Вона прокидається кожну хвилину і ставить собі одне-єдине запитання:

"Чи є у мене в списку завдання, яке треба виконати саме в цю хвилину?"

Якщо є — вона його виконує. Якщо ні — засинає до наступної хвилини.

Ключові поняття:

  1. Daemon (crond): Той самий трудяга, що працює у фоні.
  2. Crontab (Cron Table): Це файл (або таблиця), де записаний ваш розклад. Це ваш список доручень для демона.

Як читати цей дивний синтаксис?

Коли ви відкриваєте Crontab, ви бачите щось лякаюче на кшталт: * * * * * command. Не панікуйте! Це просто 5 слотів для часу. Давайте розберемо їх зліва направо. Я люблю уявляти це як фільтри, що звужуються:

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

Що треба запам'ятати залізно: Послідовність Хвилина -> Година -> День -> Місяць -> День тижня.

Інтуїтивне правило: Зірочка * означає "кожен". Тобто "кожну хвилину", "кожну годину" і так далі.


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

Давайте подивимося на код. Відкрийте терміналі. Зазвичай ми редагуємо розклад командою crontab -e.

Приклад 1: "Надокучливий привіт"

Уявіть, ми пишемо такий рядок:

* * * * * echo "Привіт, світе!" >> /tmp/hello.txt

Питання до вас: Як часто цей файл буде оновлюватися? . . . Відповідь: Щохвилини! Чому? Тому що * скрізь. Кожну хвилину, кожної години, кожного дня... демон бачить збіг і виконує команду.


Приклад 2: "Нічний сторож" (Класичний бекап)

Тепер реальніше. Ми хочемо робити бекап рівно о 03:30 ночі щодня.

30 3 * * * /scripts/backup.sh

Розбір: * Хвилина: 30 * Година: 3 (третя ночі) * Решта: * (будь-який день, будь-який місяць). Отже, о 03:30 щодня скрипт запуститься.


Приклад 3: "Офісний планктон"

Завдання складніше. Нам потрібно запускати звіт лише у робочі дні (з понеділка по п'ятницю) о 9:00 ранку.

Спробуйте здогадатися, як це виглядатиме, перш ніж читати далі. . . . Ось рішення:

0 9 * * 1-5 /scripts/morning_report.py

Чому так? * 0 9 — рівно о 9:00. * * * — будь-якого числа, будь-якого місяця. * 1-5 — тут магія. 1 — Понеділок, 5 — П'ятниця. Дефіс означає діапазон.


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

Час "забруднити руки". Ось вам завдання. Спробуйте написати правильний рядок для crontab.

Завдання 1 (Розігрів): Запустити скрипт clearcache.sh рівно о 17:45 кожного дня.

Завдання 2 (Вихідні): Запускати оновлення системи (update.sh) опівночі, але тільки в суботу та неділю.

Завдання 3 (Знайди помилку): Студент написав такий рядок, щоб запускати скрипт о 14:00 щодня: * 14 * * * /script.sh Питання: Що станеться насправді? (Це дуже небезпечна помилка!)

Завдання 4 (Реальний кейс): Вам треба запускати скрипт зарплати pay.php 1-го числа кожного місяця о 8:00 ранку.

Завдання 5 (А що, якщо...): Вам потрібно, щоб скрипт запустився один раз — одразу після перезавантаження сервера, а не за розкладом. Як це зробити? (Підказка: гугліть "cron special strings").


Відповіді для самоперевірки (не підглядайте одразу!): 1. 45 17 * * * ... 2. 0 0 * * 6,0 ... (або 0 0 * * 0,6) 3. Помилка: Скрипт буде запускатися кожну хвилину протягом 14-ї години (14:00, 14:01... 14:59). Правильно: 0 14 * * *. 4. 0 8 1 * * ... 5. @reboot /path/to/script.sh


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

Тепер послухайте уважно. Знати синтаксис — це одне. Вміти використовувати інструмент професійно — це інше.

1. Абсолютні шляхи — ваші найкращі друзі

Новачки часто пишуть: 0 5 * * * python script.py. І це не спрацює. Чому? Тому що Cron прокидається в дуже обмеженому середовищі. Він не знає, де лежить ваш python, і не знає, в якій папці лежить script.py. Як думає профі: Завжди вказуй повний шлях. /usr/bin/python3 /home/david/project/script.py

2. Куди зникає вивід?

Коли ви запускаєте скрипт у терміналі, ви бачите помилки на екрані. Cron не має екрану. Якщо скрипт впаде, ви про це не дізнаєтесь. Рішення: Перенаправляйте вивід у лог-файл. 0 5 * * * /script.sh >> /var/log/myscript.log 2>&1 (Це магічне заклинання в кінці записує і звичайний текст, і помилки в один файл).

3. Не будьте героєм — використовуйте інструменти

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


6. 🧩 Підсумок

Отже, що ми маємо сьогодні?

  1. Ми зрозуміли, що ручна робота — ворог ефективності.
  2. Ми дізналися про Cron — вартового часу у Linux.
  3. Ми розібрали магію * * * * * (хвилини, години, дні, місяці, тижні).
  4. Ми навчилися уникати пастки "щохвилинного запуску" замість "щогодинного".

Тепер ви вмієте планувати задачі. Ваш код може жити своїм життям, поки ви спите. Це суперсила.

Тизер: Але зачекайте... Що, якщо вам потрібно запустити задачу не за часом, а коли відбудеться певна подія? Наприклад, коли новий файл з'явиться в папці? Cron тут безсилий. Наступного разу ми поговоримо про Systemd Services та моніторинг подій.

А на сьогодні це все. Це був Cron. Це був CS50. До зустрічі!