Вопрос или проблема
Я пытаюсь добавить периодическую службу 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 файл корректно настроены и активированы в системе.
Пример
В вашем случае у вас есть два файла юнитов:
-
Файл сервисов
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>
-
Файл тимера
cleanup-service.timer
:[Unit] Description=Run cleanup-service periodically [Timer] OnCalendar=*-*-* 14:08:00 [Install] WantedBy=timers.target
Применение
Теперь перейдём к практическому решению вашей проблемы. Следует отметить несколько важных аспектов:
-
Запуск Timer:
Само по себе выполнение команды
systemctl enable cleanup-service.timer
не активирует сам timer. Эта команда только добавляет timer в автоматическую загрузку при старте системы, но чтобы запустить его сразу, необходимо также выполнить команду:systemctl start cleanup-service.timer
Или использовать параметр
--now
, который делает это автоматически:systemctl enable --now cleanup-service.timer
-
Проверка статуса Timer:
После выполнения этих команд проверьте статус timer с помощью:
systemctl status cleanup-service.timer
Это предоставит более детальную информацию о состоянии timer и потенциальных ошибках.
-
Проверка логов:
В случае возникновения ошибок или необычного поведения, следует использовать утилиту journalctl для просмотра логов:
journalctl -u cleanup-service.timer
Это поможет выявить проблемы с конфигурацией или выполнение.
-
Проверка конфигурации:
Убедитесь в корректности конфигурации. Проверьте, чтобы
ExecStart
в вашем service указывают на правильную и доступную команду. Также убедитесь, что указанный EnvironmentFile доступен и корректен. -
Зависимости Service:
Убедитесь, что указанные вами зависимости правильно настроены. В вашем случае, если mysql.service не запущена, то и ваш cleanup-service не будет работать, так как он требует её наличия.
-
Перезагрузка:
В редких случаях при изменениях конфигурации может потребоваться перезагрузка системы. Однако лучше избегать этого, если проблема заключается только в том, что timer не запущен.
Подводя итог, ваша проблема может быть связана с тем, что timer не был запущен после включения. Необходимо выполнить команды, обеспечивающие его активное состояние. Надеюсь, следуя данным шагам, вы сможете успешно настроить и поддерживать работу своего systemd timer на Debian 10.