Cron у Linux: синтаксис crontab і приклади розкладів

Cron — планувальник завдань у Linux. Він запускає команди та скрипти за розкладом: резервні копії вночі, очищення тимчасових файлів раз на тиждень, перевірку сертифікатів щодня.
Керування завданнями
Кожен користувач має власну таблицю завдань — crontab.
crontab -e # відкрити таблицю в редакторі
crontab -l # показати поточні завдання
crontab -r # видалити всі завдання користувача
Щоб змінити завдання іншого користувача, додайте -u: sudo crontab -u www-data -e.
Формат рядка
* * * * * команда
│ │ │ │ │
│ │ │ │ └─ день тижня (0–7, де 0 і 7 — неділя)
│ │ │ └─── місяць (1–12)
│ │ └───── день місяця (1–31)
│ └─────── година (0–23)
└───────── хвилина (0–59)
У кожному полі допустимі:
*— будь-яке значення;5— конкретне значення;1,15— список;1-5— діапазон;*/10— кожні 10 одиниць.
Приклади розкладів
| Розклад | Коли виконується |
|---|---|
* * * * * |
щохвилини |
*/5 * * * * |
кожні 5 хвилин |
0 * * * * |
на початку кожної години |
30 3 * * * |
щодня о 03:30 |
0 9 * * 1-5 |
у будні о 09:00 |
0 0 1 * * |
першого числа кожного місяця опівночі |
0 4 * * 0 |
щонеділі о 04:00 |
Для частих випадків є короткі позначення: @reboot (під час завантаження системи), @hourly, @daily, @weekly, @monthly.
Практичні завдання
Щоденна резервна копія сайту о 02:00:
0 2 * * * tar -czf /backup/site-$(date +\%F).tar.gz /var/www/site
Синхронізація каталогу кожні 15 хвилин:
*/15 * * * * rsync -a /var/www/ backup@203.0.113.20:/backup/www/
Запуск скрипта після перезавантаження сервера:
@reboot /opt/scripts/start.sh
Вивід і логи
Типово cron намагається надіслати вивід команди поштою, і на сервері без поштової служби він губиться. Перенаправляйте вивід у файл:
0 2 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2>&1
Запис 2>&1 додає в той самий файл повідомлення про помилки. Факт запуску завдань видно в системному журналі:
journalctl -u cron --since today # Debian, Ubuntu
journalctl -u crond --since today # AlmaLinux, Rocky Linux, RHEL
Захист від повторного запуску
Якщо завдання виконується довше за інтервал між запусками, копії почнуть накладатися одна на одну. Утиліта flock запускає команду, лише якщо попередній екземпляр завершився:
*/5 * * * * flock -n /tmp/sync.lock /opt/scripts/sync.sh
Типові помилки
- Команда працює в терміналі, але не в cron. У cron мінімальне оточення й короткий
PATH. Вказуйте повні шляхи до програм (/usr/bin/php) або задайтеPATHпершим рядком crontab. - Символ
%. У crontab він означає перехід на новий рядок. У командах його потрібно екранувати:date +\%F. - Відносні шляхи. Завдання запускається з домашнього каталогу користувача. Використовуйте абсолютні шляхи або
cd /path && команда. - Скрипт не виконуваний. Виконайте
chmod +x script.shі додайте перший рядок#!/bin/bash. - Часовий пояс. Cron використовує системний час. Перевірте його командою
timedatectl.
Системні завдання
Крім користувацьких таблиць є системні:
/etc/crontabі файли в/etc/cron.d/— той самий формат, але з додатковим полем імені користувача перед командою;/etc/cron.daily/,/etc/cron.weekly/,/etc/cron.monthly/— скрипти з цих каталогів виконуються з відповідною періодичністю.
Cron і таймери systemd
У сучасних дистрибутивах частину завдань виконують таймери systemd. Вони вміють запускати пропущені завдання після простою сервера й ведуть докладний журнал, але потребують двох файлів замість одного рядка. Для простих розкладів на VPS cron залишається найшвидшим рішенням. Переглянути активні таймери можна командою systemctl list-timers.
Відеоінструкція



