Что означает ошибка bad hour
Ошибка bad hour появляется в журнале событий cron, когда значение часа в записи crontab находится вне допустимого диапазона 0–23. Например, значение 25 или —1 вызовет у cron сообщение «bad hour», и запланированная задача не будет выполнена.
Feb 18 08:00:01 hostname CRON[1234]: (root) CMD (echo "test" >> /var/log/test.log)
Feb 18 09:00:01 hostname CRON[1235]: bad hour while reading /etc/crontab
Причины возникновения
- Часовое значение вне диапазона – значение меньше 0 или больше 23 (например,
25или-2). - Использование нестандартного формата – попытка задать час с помощью буквенного обозначения (
Jan,Feb) или пробелов. - Повреждение файла crontab – случайное добавление символов, лишних запятых или скобок вокруг числового значения часа.
- Неправильное копирование данных – при ручном редактировании файла с помощью текстового редактора копируется нечисловая часть (например, «час: 99»).
Способы решения
Способ 1: Редактирование crontab через crontab -e
- Просмотрите текущий график –
crontab -l. - Откройте файл для редактирования –
crontab -e. - Найдите строку с неверным часом (обычно она отмечена в журнале).
- Исправьте значение часа – убедитесь, что оно находится в диапазоне
0–23. - Сохраните и выйдите (Ctrl+O, Enter в nano;
:wqв vim).
⚠️ Важно: Значения часов в cron отсчитываются от 0 (полночь) до 23 (последний час дня).
Способ 2: Использование sed для замены часа
Если вам нужно быстро исправить несколько записей, выполните следующую команду:
# Замените любое значение часа, не соответствующее шаблону 0-23, на допустимое значение (например, 08)
crontab -l | sed -E 's/([0-9]{1,2})\s+([0-9]{1,2})/\1 \2/' | crontab -
sed удаляет лишние символы и приводит формат к стандартному виду. После выполнения команды проверьте результат: crontab -l.
Способ 3: Пересоздание crontab
- Сделайте резервную копию –
crontab -l > ~/cron_backup.txt. - Удалите текущий график –
crontab -r(подтвердите удаление). - Добавьте правильные задания –
crontab -eи введите нужные строки.
Способ 4: Переход на systemd timers (для продвинутых пользователей)
Для новых систем, использующих systemd, рекомендуется заменить cron-задания на таймеры:
# /etc/systemd/system/myjob.timer
[Unit]
Description=Запуск моей задачи каждый день в 09:00
[Timer]
OnCalendar=*-*-* 09:00:00
Persistent=true
[Install]
WantedBy=timers.target
# /etc/systemd/system/myjob.service
[Unit]
Description=Выполнение моей задачи
[Service]
ExecStart=/path/to/your/script.sh
Включите и запустите таймер:
systemctl enable myjob.timer
systemctl start myjob.timer
Профилактика
- Проверяйте диапазоны перед сохранением – многие редакторы crontab имеют встроенную проверку; вы можете также использовать скрипт:
crontab -l | while read line; do hour=$(echo "$line" | awk '{print $2}') if [[ $hour -lt 0 || $hour -gt 23 ]]; then echo "Неверный час в строке: $line" fi done - Ведите журнал изменений – храните копии crontab в
/etc/cron.d/backup/, чтобы быстро восстановиться при ошибке. - Используйте инструменты автодополения – такие как
crontab-gtk(в графическом интерфейсе) или плагины редактора, которые подсвечивают недопустимые значения. - Регулярно проверяйте логи –
journalctl -u cronили/var/log/syslogпомогут обнаружить ошибку сразу после её возникновения.