Cron: примеры расписания и как настроить crontab

Категория: Bash · Язык: Bash · Обновлено:

Строка в crontab состоит из пяти полей времени и команды: минута час день_месяца месяц день_недели команда. Пример 30 3 * * * /opt/backup.sh запускает скрипт каждый день в 3:30. Открыть расписание для правки можно командой crontab -e.

Формат строки

Текст
┌───────── минута (0–59)
│ ┌─────── час (0–23)
│ │ ┌───── день месяца (1–31)
│ │ │ ┌─── месяц (1–12)
│ │ │ │ ┌─ день недели (0–7, где 0 и 7 воскресенье)
│ │ │ │ │
* * * * *  команда

Символ

Значение

Пример

*

Любое значение

* * * * * каждую минуту

,

Список

0 8,20 * * * в 8:00 и 20:00

-

Диапазон

0 9 * * 1-5 по будням в 9:00

/

Шаг

*/5 * * * * каждые 5 минут

Готовые расписания

Текст
*/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                   # раз в сутки, в полночь

Управление расписанием

Bash
crontab -e                           # открыть своё расписание в редакторе
crontab -l                           # показать
crontab файл.txt                     # заменить расписание содержимым файла
sudo crontab -u www-data -l          # расписание другого пользователя

Вывод и журнал

Cron не показывает вывод программы. Отправьте его в файл и не забудьте перенаправить ошибки:

Bash
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 означает перевод строки. Экранируйте его обратной косой чертой:

Bash
0 1 * * * tar -czf /backup/site-$(date +\%F).tar.gz /var/www

Если задача может работать дольше интервала, запустите её через flock, чтобы не получить две копии одновременно:

Bash
*/5 * * * * flock -n /tmp/sync.lock /opt/sync.sh

Проверить, что cron работает

Bash
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 над строкой (поддерживается не всеми реализациями).