Ось урок на тему "Cron та планування задач", згенерований у стилі David Malan / CS50 спеціально для тебе.
🕰️ Cron: Як підкорити час у Linux
Привіт, друзі! Ласкаво просимо. Це CS50, і сьогодні ми поговоримо про дещо фундаментальне.
1. 🔥 Вступ: Проблема та мотивація
Уявіть собі ситуацію. Ви — системний адміністратор або розробник. У вас є база даних вашого чудового стартапу. Що станеться, якщо сервер "впаде" і диск згорить? Правильно, катастрофа. Щоб цього уникнути, ви робите резервні копії (бекапи).
Але як ви це робите? Ви ставите будильник на 3-тю годину ночі, прокидаєтеся, вмикаєте ноутбук, заходите на сервер і запускаєте скрипт копіювання? І так щодня?
Звісно, ні. Це було б божевіллям, чи не так?
Або інший приклад: уявіть, що ви власник інтернет-магазину, і вам потрібно щопонеділка надсилати клієнтам дайджест новин. Ви будете надсилати їх вручну кожному з тисячі клієнтів?
Світ IT тримається на автоматизації. Ми хочемо написати код один раз і дозволити машині виконувати рутинну роботу за нас. Нам потрібен надійний "будильник" всередині операційної системи, який ніколи не спить і точно знає, коли натиснути кнопку "Пуск".
Сьогодні ми розберемося з інструментом, який робить саме це. Зустрічайте — Cron. Без нього сучасний інтернет просто зупинився б.
2. 🧠 Теоретична база: Що там "під капотом"?
Слово Cron походить від грецького Chronos (час).
Якщо зовсім просто: Cron — це планувальник задач. Це така маленька програмка (демон), яка працює у фоновому режимі вашої системи (Linux/Unix). Вона прокидається кожну хвилину і ставить собі одне-єдине запитання:
"Чи є у мене в списку завдання, яке треба виконати саме в цю хвилину?"
Якщо є — вона його виконує. Якщо ні — засинає до наступної хвилини.
Ключові поняття:
- Daemon (
crond): Той самий трудяга, що працює у фоні. - Crontab (Cron Table): Це файл (або таблиця), де записаний ваш розклад. Це ваш список доручень для демона.
Як читати цей дивний синтаксис?
Коли ви відкриваєте Crontab, ви бачите щось лякаюче на кшталт: * * * * * command.
Не панікуйте! Це просто 5 слотів для часу. Давайте розберемо їх зліва направо. Я люблю уявляти це як фільтри, що звужуються:
- Хвилини (0–59)
- Години (0–23)
- День місяця (1–31)
- Місяць (1–12)
- День тижня (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. 🧩 Підсумок
Отже, що ми маємо сьогодні?
- Ми зрозуміли, що ручна робота — ворог ефективності.
- Ми дізналися про Cron — вартового часу у Linux.
- Ми розібрали магію
* * * * *(хвилини, години, дні, місяці, тижні). - Ми навчилися уникати пастки "щохвилинного запуску" замість "щогодинного".
Тепер ви вмієте планувати задачі. Ваш код може жити своїм життям, поки ви спите. Це суперсила.
Тизер: Але зачекайте... Що, якщо вам потрібно запустити задачу не за часом, а коли відбудеться певна подія? Наприклад, коли новий файл з'явиться в папці? Cron тут безсилий. Наступного разу ми поговоримо про Systemd Services та моніторинг подій.
А на сьогодні це все. Це був Cron. Це був CS50. До зустрічі!