Cron: примеры расписания и как настроить crontab
Строка в crontab состоит из пяти полей времени и команды: минута час день_месяца месяц день_недели команда. Пример 30 3 * * * /opt/backup.sh запускает скрипт каждый день в 3:30. Открыть расписание для правки можно командой crontab -e.
Формат строки
┌───────── минута (0–59)
│ ┌─────── час (0–23)
│ │ ┌───── день месяца (1–31)
│ │ │ ┌─── месяц (1–12)
│ │ │ │ ┌─ день недели (0–7, где 0 и 7 воскресенье)
│ │ │ │ │
* * * * * командаСимвол | Значение | Пример |
|---|---|---|
| Любое значение |
|
| Список |
|
| Диапазон |
|
| Шаг |
|
Готовые расписания
*/5 * * * * /opt/job.sh # каждые 5 минут
0 * * * * /opt/job.sh # каждый час, в начале часа
0 */2 * * * /opt/job.sh # каждые 2 часа
30 3 * * * /opt/job.sh # каждый день в 3:30
0 9 * * 1-5 /opt/job.sh # по будням в 9:00
0 0 * * 0 /opt/job.sh # по воскресеньям в полночь
0 0 1 * * /opt/job.sh # первого числа каждого месяца
0 8,20 * * * /opt/job.sh # дважды в день: 8:00 и 20:00
@reboot /opt/job.sh # при запуске системы
@daily /opt/job.sh # раз в сутки, в полночьУправление расписанием
crontab -e # открыть своё расписание в редакторе
crontab -l # показать
crontab файл.txt # заменить расписание содержимым файла
sudo crontab -u www-data -l # расписание другого пользователяВывод и журнал
Cron не показывает вывод программы. Отправьте его в файл и не забудьте перенаправить ошибки:
30 3 * * * /opt/backup.sh >> /var/log/backup.log 2>&1Окружение cron отличается от терминала
В cron нет вашего PATH и переменных из .bashrc, обычно доступны только /usr/bin и /bin. Поэтому:
указывайте полные пути:
/usr/local/bin/python3, а неpython3;задавайте переменные в начале файла:
PATH=/usr/local/bin:/usr/bin:/bin;внутри скрипта переходите в нужную папку через
cd.
Знак процента и защита от наложения
Знак % в строке crontab означает перевод строки. Экранируйте его обратной косой чертой:
0 1 * * * tar -czf /backup/site-$(date +\%F).tar.gz /var/wwwЕсли задача может работать дольше интервала, запустите её через flock, чтобы не получить две копии одновременно:
*/5 * * * * flock -n /tmp/sync.lock /opt/sync.shПроверить, что cron работает
systemctl status cron # в Debian и Ubuntu; в CentOS служба называется crond
grep CRON /var/log/syslog | tail # журнал запусков в Debian и Ubuntu
journalctl -u cron --since "1 hour ago" # то же через journaldЧастые вопросы
Почему задача запускается в терминале, а в cron нет?
Почти всегда из-за окружения: не найден PATH, относительные пути или права. Добавьте >> job.log 2>&1 и прочитайте ошибку.
Как запускать задачу раз в 10 секунд?
Cron работает с точностью до минуты. Используйте таймер systemd или цикл со sleep внутри скрипта.
Какой часовой пояс использует cron?
Системный. Проверьте timedatectl. Для отдельной задачи можно задать переменную CRON_TZ=Europe/Moscow над строкой (поддерживается не всеми реализациями).