Cron-завдання на хостингу: як автоматизувати рутину і звільнити собі 10 годин на тиждень
Щоранку о 7:15 один мій знайомий адміністратор заходив на сервер, вручну чистив кеш, запускав бекап бази, перевіряв лог-файли, відправляв звіт на пошту. Кожен. Божий. День. Так тривало два роки, поки одного ранку він просто проспав - і нічого не зламалось. Бо за тиждень до того я показав йому cron. Ця маленька утиліта Unix, якій вже більше 40 років, досі залишається найпотужнішим інструментом автоматизації на будь-якому хостингу. І якщо ви досі робите щось на сервері руками - ця стаття для вас.
Що таке cron і чому він працює як швейцарський годинник
Cron - це планувальник задач у Linux/Unix-системах. Уявіть собі надійного будильника, який ніколи не розряджається, не забуває і не бере відпустку. Ви кажете йому: "кожну середу о третій ночі зроби ось це" - і він виконує. Без питань, без нагадувань, без помилок.
Кожен хостинг - від найдешевшого шареда за $2 на місяць до потужного виділеного сервера - має cron. Але за статистикою Plesk, лише 23% користувачів хостингу використовують хоча б одне cron-завдання. Решта 77% або не знають про нього, або бояться "щось зламати". Давайте це виправимо.

Анатомія crontab: розшифровуємо п'ять зірочок
Серце cron - файл crontab. Кожен рядок у ньому виглядає лякаюче, але насправді це простіше, ніж рецепт борщу. Ось формула:
* * * * * /шлях/до/команди
П'ять зірочок - п'ять позицій. Зліва направо:
- Хвилина (0-59) - коли саме протягом години
- Година (0-23) - котра година доби
- День місяця (1-31) - якого числа
- Місяць (1-12) - який місяць року
- День тижня (0-7, де 0 і 7 - неділя) - який день
Зірочка означає "будь-яке значення". Тобто * * * * * - це щохвилини. Страшно? Не хвилюйтеся, ніхто так не робить (майже ніхто).
| Запис у crontab | Що це означає | Реальний кейс |
|---|---|---|
| 0 3 * * * | Щодня о 3:00 | Бекап бази даних |
| */15 * * * * | Кожні 15 хвилин | Перевірка аптайму сайту |
| 0 0 * * 0 | Щонеділі опівночі | Очищення старих логів |
| 30 8 1 * * | 1-го числа о 8:30 | Генерація місячного звіту |
| 0 */6 * * * | Кожні 6 годин | Оновлення кешу товарів |
Бачите? Жодної магії. П'ять цифр, один шлях до скрипта - і сервер працює на вас, а не ви на нього.
Сім завдань, які варто автоматизувати прямо зараз
Окей, синтаксис зрозумілий. Але що конкретно автоматизувати? Ось мій перевірений список, сформований за роки роботи з десятками проектів:
- Бекапи бази і файлів - щоденно о 3:00-4:00, коли трафік мінімальний
- Очищення тимчасових файлів - /tmp, кеш-директорії, сесії старше 24 годин
- Перевірка SSL-сертифікатів - скрипт, що попереджає за 14 днів до закінчення
- Оновлення sitemap.xml - критично для SEO, особливо для великих сайтів
- Ротація логів - щоб один access.log не з'їв весь диск за місяць

Реальна історія: інтернет-магазин із 50 000 товарів не оновлював sitemap автоматично. Google індексував лише 12 000 сторінок. Після додавання одного cron-завдання 0 4 * * * /usr/bin/php /var/www/generate_sitemap.php за три тижні індексація зросла до 47 000 сторінок. Трафік подвоївся. Один рядок у crontab.
"Автоматизація - це не про лінь. Це про те, щоб розум людини працював над складними завданнями, а машина займалась повторюваними." - Тім Феріс, автор "The 4-Hour Workweek"
Як налаштувати cron: три шляхи для різних рівнів
Залежно від вашого хостингу і досвіду, є три способи дістатися до cron. Від найпростішого до хардкорного.
Шлях 1: Панель керування (cPanel, Plesk, DirectAdmin)
Заходите в панель, знаходите розділ "Cron Jobs" або "Scheduled Tasks". Обираєте частоту з випадаючого меню, вставляєте команду. Готово. Це варіант для 90% користувачів шаред-хостингу. У cPanel це буквально 4 кліки.
Шлях 2: SSH і команда crontab -e
Підключаєтеся до сервера через SSH, набираєте crontab -e, додаєте рядок, зберігаєте. Все. Цей варіант для VPS і виділених серверів. Файл відкриється у текстовому редакторі (зазвичай nano або vi). Якщо vi вас лякає - наберіть EDITOR=nano crontab -e і працюйте у зручнішому nano.
Шлях 3: Системний crontab /etc/crontab
Тут можна задавати завдання від різних користувачів. Формат трохи інший - між часом і командою додається ім'я користувача: 0 3 * * * root /usr/local/bin/backup.sh. Це вже для адміністраторів, які керують сервером цілком.
Порада, яка врятує вам нерви: після створення завдання завжди перевіряйте, чи вказали повний шлях до інтерпретатора. Не php script.php, а /usr/bin/php /повний/шлях/script.php. Cron не знає ваших аліасів і змінних середовища. Це причина №1, чому "cron не працює".
Типові помилки, через які cron мовчить як партизан
Знаєте, що найгірше у cron? Він не скаже вам, що щось пішло не так. Він просто промовчить. Ваш скрипт впаде з помилкою - і ви дізнаєтесь про це через тиждень, коли бекапів не виявиться. Ось топ помилок, які я бачив сотні разів:
- Відносні шляхи замість абсолютних. Cron запускає команди з домашньої директорії, а не з папки вашого проекту. Шлях
./backup.shне спрацює - пишіть/home/user/scripts/backup.sh - Відсутність прав на виконання. Забули
chmod +x script.sh? Cron теж не зможе його запустити - Неправильний інтерпретатор. На сервері може бути PHP 7.4 і PHP 8.2 одночасно.
/usr/bin/phpвказує на одну версію,/usr/bin/php8.2- на іншу - Ігнорування виводу. Додайте
>> /var/log/mycron.log 2>&1в кінці команди. Так ви бачитимете і результат, і помилки - Часовий пояс. Сервер у Франкфурті, ви в Києві - різниця в годину. Перевірте
timedatectlперед налаштуванням

Ще одна підступна штука - перекриття завдань. Якщо ваш скрипт бекапу працює 20 хвилин, а ви запускаєте його кожні 15 хвилин - два процеси перетнуться, навантажать сервер і можуть пошкодити дані. Рішення? Використовуйте flock: */15 * * * * /usr/bin/flock -n /tmp/backup.lock /home/user/backup.sh. Flock створює файл-замок і не дає запустити другу копію, поки перша не завершилась.
Просунуті прийоми: від аматора до профі за один вечір
Базу ви вже знаєте. Тепер - кілька прийомів, які відрізняють новачка від того, хто дійсно розуміє, що робить.
Сповіщення про збої у Telegram. Додайте в кінці вашого bash-скрипта перевірку exit-коду і відправку повідомлення через Telegram Bot API. Виглядає приблизно так: якщо скрипт завершився з помилкою - curl відправляє вам повідомлення в чат. Ви дізнаєтесь про проблему за секунди, а не за дні.
Спеціальні рядки замість цифр. Cron підтримує зручні скорочення:
@reboot- виконати один раз при перезавантаженні сервера@daily- те саме, що0 0 * * *@weekly- те саме, що0 0 * * 0@hourly- те саме, що0 * * * *
Набагато читабельніше, правда? @daily /home/user/cleanup.sh зрозуміє навіть людина, яка вперше бачить crontab.
Ланцюжки завдань. Потрібно спочатку зробити дамп бази, потім стиснути його, потім завантажити на S3? Не створюйте три окремі cron-завдання з різницею у 10 хвилин. Напишіть один bash-скрипт, де кожен наступний крок виконується тільки після успішного завершення попереднього (через &&). Один рядок у crontab, один скрипт, повний контроль.
Золоте правило: кожне cron-завдання повинне бути задокументоване. Коментар у crontab починається з #. Через рік ви не згадаєте, навіщо запускаєте якийсь process_queue.php кожні 5 хвилин. Але коментар # Обробка черги email-розсилок для маркетингового модуля все пояснить.
А що, якщо cron - це замало?
Cron ідеальний для простих періодичних завдань. Але якщо вам потрібна складна логіка - запуск задачі тільки після завершення іншої, повторні спроби при помилках, візуальний моніторинг - подивіться на інструменти типу Ofelia (для Docker-середовищ), Laravel Task Scheduling (для PHP-проектів) або Celery Beat (для Python). Вони побудовані поверх тієї ж ідеї, але дають більше гнучкості.
Втім, для 95% задач на типовому хостингу cron - це все, що вам потрібно. Серйозно. Не ускладнюйте те, що працює.
Ось вам виклик: відкрийте прямо зараз панель вашого хостингу, знайдіть розділ Cron Jobs і створіть хоча б одне завдання. Нехай це буде простий скрипт, що записує дату у файл - @hourly date >> /home/user/cron_test.log. Через годину перевірте лог. Якщо там є рядок з часом - вітаю, ви тільки що зробили перший крок до сервера, який працює на вас навіть коли ви спите. А скільки годин на тиждень ви витрачаєте на те, що міг би зробити один рядок у crontab?