Почему мой пользовательский таймер systemd загружается как “inactive dead”?

Вопрос или проблема

Я пытаюсь добавить периодическую службу systemd на машину с Debian 10. В основном, я хочу, чтобы она очищала базу данных раз в неделю. Файл службы, который я могу подтвердить, работает, когда я запускаю:

# systemctl start cleanup-service

Который является:

[Unit]
Description=Remove old entries from database
Requires=mysql.service
After=mysql.service
OnFailure=unit-status-mail@%n.service

[Service]
Type=oneshot
EnvironmentFile=/etc/environment
ExecStart=<some command>

Таймер, который я скопировал из другого, работающего таймера, это

[Unit]
Description=Run cleanup-service periodically
[Timer]
OnCalendar=*-*-* 14:08:00
[Install]
WantedBy=timers.target

Однако, когда я запускаю:

# systemctl enable cleanup-service.timer
$ systemctl --all

Соответствующая строка гласит:

backup-service.timer      loaded    active   waiting   Run backup-service service periodically 
cleanup-service.timer     loaded    inactive dead      Run cleanup-service service periodically 

Я понятия не имею, как диагностировать это. Все разрешения одинаковые. Возможно, сервер нуждается в перезагрузке, но это придется сделать в другое время. Вне перезагрузки, я не знаю, что еще можно попробовать.

Есть ли какая-то тонкость systemd, которую я упускаю здесь?

Вы не сделали systemctl start (или enable --now) для таймера. Запуск юнита – это то, что активирует его.

.

Ответ или решение

Проблема, с которой вы столкнулись при работе с systemd timers на вашей Debian 10 машине, заключается в том, что ваш пользовательский timer загружается как "inactive dead". Это распространенная проблема, которая может происходить по ряду причин, связанных с конфигурацией или запуском timer. Давайте подробно рассмотрим, как systemd timers работают и что может быть не так в вашем конкретном случае.

Теория

Systemd Timers представляют собой один из мощных инструментов systemd для организации периодического выполнения задач. Они работают аналогично cron, но предлагают более тесную интеграцию с остальной частью системы, обеспечивая логгирование, зависимости и состояния. Каждый timer обычно связан с определенной service, и при наступлении заданного события выполняется запуск этой службы.

Основные компоненты:

  • [Unit] — общая информация о юните, включая описание, зависимости и статус в случае ошибочного завершения.
  • [Timer] — настройки для определения периодичности событий.
  • [Install] — информация о том, как юнит должен быть включен в систему.

Для успешной работы timer необходимо убедиться, что timer файл и service файл корректно настроены и активированы в системе.

Пример

В вашем случае у вас есть два файла юнитов:

  1. Файл сервисов cleanup-service.service:

    [Unit]
    Description=Remove old entries from database
    Requires=mysql.service
    After=mysql.service
    OnFailure=unit-status-mail@%n.service
    
    [Service]
    Type=oneshot
    EnvironmentFile=/etc/environment
    ExecStart=<some command>
  2. Файл тимера cleanup-service.timer:

    [Unit]
    Description=Run cleanup-service periodically
    
    [Timer]
    OnCalendar=*-*-* 14:08:00
    
    [Install]
    WantedBy=timers.target

Применение

Теперь перейдём к практическому решению вашей проблемы. Следует отметить несколько важных аспектов:

  1. Запуск Timer:

    Само по себе выполнение команды systemctl enable cleanup-service.timer не активирует сам timer. Эта команда только добавляет timer в автоматическую загрузку при старте системы, но чтобы запустить его сразу, необходимо также выполнить команду:

    systemctl start cleanup-service.timer

    Или использовать параметр --now, который делает это автоматически:

    systemctl enable --now cleanup-service.timer
  2. Проверка статуса Timer:

    После выполнения этих команд проверьте статус timer с помощью:

    systemctl status cleanup-service.timer

    Это предоставит более детальную информацию о состоянии timer и потенциальных ошибках.

  3. Проверка логов:

    В случае возникновения ошибок или необычного поведения, следует использовать утилиту journalctl для просмотра логов:

    journalctl -u cleanup-service.timer

    Это поможет выявить проблемы с конфигурацией или выполнение.

  4. Проверка конфигурации:

    Убедитесь в корректности конфигурации. Проверьте, чтобы ExecStart в вашем service указывают на правильную и доступную команду. Также убедитесь, что указанный EnvironmentFile доступен и корректен.

  5. Зависимости Service:

    Убедитесь, что указанные вами зависимости правильно настроены. В вашем случае, если mysql.service не запущена, то и ваш cleanup-service не будет работать, так как он требует её наличия.

  6. Перезагрузка:

    В редких случаях при изменениях конфигурации может потребоваться перезагрузка системы. Однако лучше избегать этого, если проблема заключается только в том, что timer не запущен.

Подводя итог, ваша проблема может быть связана с тем, что timer не был запущен после включения. Необходимо выполнить команды, обеспечивающие его активное состояние. Надеюсь, следуя данным шагам, вы сможете успешно настроить и поддерживать работу своего systemd timer на Debian 10.

Оцените материал
Добавить комментарий

Капча загружается...