Вопрос или проблема
Я тестирую таймер systemd и пытаюсь переопределить его тайм-аут по умолчанию, но безуспешно. Интересно, есть ли способ попросить systemd сообщить нам, когда сервис будет запущен в следующий раз.
Обычный файл (/lib/systemd/system/snapbackend.timer
):
# Документация доступна по адресу:
# https://www.freedesktop.org/software/systemd/man/systemd.timer.html
[Unit]
Description=Запуск сервиса snapbackend каждые 5 минут.
[Timer]
# Вы должны указать OnBootSec (или OnStartupSec), иначе он не будет автозапускаться
OnBootSec=5min
OnUnitActiveSec=5min
# По умолчанию точность составляет 1 минуту. Я не совсем уверен, что это как-то повлияет на нас.
# Я думаю, что так как наши компьютеры будут работать постоянно, это вряд ли будет таким неточным.
# Смотрите также:
# http://stackoverflow.com/questions/39176514/is-it-correct-that-systemd-timer-accuracysec-parameter-make-the-ticks-slip
#AccuracySec=1
[Install]
WantedBy=timers.target
# vim: syntax=dosini
Файл переопределения (/etc/systemd/system/snapbackend.timer.d/override.conf
):
# Этот файл был автоматически сгенерирован с помощью snapmanager.cgi
# Не стесняйтесь вносить дополнительные изменения здесь, так как
# snapmanager.cgi будет учитывать их, как ожидается.
[Timer]
OnUnitActiveSec=30min
Я выполнил следующие команды, но таймер все равно срабатывает каждые 5 минут. Может быть, в systemd есть ошибка?
sudo systemctl stop snapbackend.timer
sudo systemctl daemon-reload
sudo systemctl start snapbackend.timer
Я также задавался вопросом, как я могу узнать, когда таймер сработает в следующий раз? Потому что это сразу подскажет мне, будет ли это через 5 минут или через 30 минут. Однако команда systemctl status snapbackend.timer
об этом ничего не говорит. Просто интересно, существует ли команда, которая могла бы подсказать мне текущую задержку.
Для тех, кому интересно, есть также файл сервиса (/lib/systemd/system/snapbackend.service
), однако, я бы предположил, что он не должен влиять на срабатывание таймера…
# Документация доступна по адресу:
# https://www.freedesktop.org/software/systemd/man/systemd.service.html
[Unit]
Description=Демон Snap! Websites snapbackend CRON
After=snapbase.service snapcommunicator.service snapfirewall.service snaplock.service snapdbproxy.service
[Service]
# Смотрите также файл snapbackend.timer
Type=simple
WorkingDirectory=~
ProtectHome=true
NoNewPrivileges=true
ExecStart=/usr/bin/snapbackend
ExecStop=/usr/bin/snapstop --timeout 300 $MAINPID
User=snapwebsites
Group=snapwebsites
# Без авто-перезапуска, мы используем таймер для периодического запуска
# Мы также хотим, чтобы systemd считал, что exit(1) — это нормально
SuccessExitStatus=1
Nice=5
LimitNPROC=1000
# Для разработчиков и администраторов, чтобы получить вывод на консоль
#StandardOutput=tty
#StandardError=tty
#TTYPath=/dev/console
# Введите размер, чтобы получить дамп ядра в случае сбоя
#LimitCORE=10G
[Install]
WantedBy=multi-user.target
# vim: syntax=dosini
Состояние активных в данный момент таймеров можно посмотреть с помощью
systemctl list-timers
:
$ systemctl list-timers --all
NEXT LEFT LAST PASSED UNIT ACTIVATES
ср 2016-12-14 08:06:15 CET 21h left вт 2016-12-13 08:06:15 CET 2h 18min ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service
1 таймеров показано.
Из комментария и ответа от @phg, я нашел страницу с ответом. Таймеры являются накопительными и их нужно сначала сбросить, иначе сохраняется предыдущая запись. Это полезно для календарей, но работает одинаково со всеми таймерами.
Наличие одной записи, которая сбрасывает таймер перед изменением его на новое значение, работает, как ожидается:
# Этот файл был автоматически сгенерирован с помощью snapmanager.cgi
# Не стесняйтесь вносить дополнительные изменения здесь, так как
# snapmanager.cgi будет учитывать их, как ожидается.
[Timer]
OnUnitActiveSec=
OnUnitActiveSec=30min
Нет, не похоже, что есть способ точно увидеть, когда таймер будет запускаться в следующий раз. systemd
предлагает systemctl list-timers
и systemctl status что-то.timer
, но они не показывают воздействие AccuracySec=
и, возможно, других директив, которые смещают время.
Если вы установите AccuracySec=1h
на двух серверах, оба они будут сообщать, что один и тот же таймер на обоих серверах запустится в одно и то же время, но на самом деле они могут начать с разницей в час! Если вас интересует, могут ли два случайных таймера сработать одновременно, то, похоже, нет способа проверить финальное рассчитанное время запуска, чтобы узнать.
Существует открытая проблема в systemd по поводу того, чтобы сделать вывод list-timers более точным и менее запутанным.
Кроме того, есть параметр RandomizedDelaySec
, который будет комбинироваться с AccuracySec
согласно странице man.
Чтобы увидеть текущее состояние $SYSTEMD_TIMER
, выполните
systemctl list-timers $SYSTEMD_TIMER
# Выдаст вывод, похожий на следующий
# NEXT LEFT LAST PASSED UNIT ACTIVATES
# Вс 2022-01-09 21:33:00 CET 2h 9min осталось н/д н/д $SYSTEMD_TIMER $SYSTEMD_SERVICE
Поэтому для вашего конкретного вопроса команда: systemctl list-timers snapbackend.timer
.
Я знаю, что это старое, но я пришел сюда в поисках ответа на этот вопрос, и ни один из них не подошел. Они прекрасно работают, если вы устраняете неполадки на консоли — но если вам нужно знать это в сценарии, это не идеально. Если кто-то другой сюда попадет по той же причине, вы можете получить это так:
systemctl show myTimer.timer| awk -F= '$1 == "NextElapseUSecRealtime" { print $2 }'
.
Ответ или решение
Для профессионального понимания вопроса о том, как определить, когда следующий раз сработает таймер systemd, важно учитывать основы работы этой системы и применить необходимые команды для получения точной информации о запланированных запусках.
Теория
Таймеры systemd являются мощным инструментом для автоматизации задач, таких как запуск сервисов в определенные промежутки времени или по заранее установленному расписанию. Они аналогичны cron
, но используют возможности и гибкость, предоставляемые systemd, включая управление зависимостями и более сложные условия запуска.
Основные параметры, регулирующие поведение таймера, такие как OnBootSec
, OnUnitActiveSec
, и AccuracySec
, задают, когда должны выполняться запланированные задачи. Однако, когда вы изменяете или переопределяете таймер, важно учитывать, что новые параметры могут не вступить в силу без предварительного обнуления предыдущих настроек. Эта особенность systemd может привести к ситуациям, когда изменения не оказывают ожидаемого эффекта.
Пример
В вашем случае изначальный файл /lib/systemd/system/snapbackend.timer
задавал запуск каждые 5 минут, но переопределяющий файл /etc/systemd/system/snapbackend.timer.d/override.conf
указывал на необходимость запуска каждые 30 минут. Скорее всего, проблема заключалась в том, что параметр OnUnitActiveSec
из предыдущего конфигурационного файла не был сброшен должным образом.
Для успешного переопределения необходимо сначала сбросить существующую установку, а затем задать новую:
[Timer]
OnUnitActiveSec=
OnUnitActiveSec=30min
Это гарантирует, что предыдущая конфигурация будет удалена, и новая вступит в силу.
Применение
Сейчас перейдем к командной оболочке: зная, что команда systemctl status
не предоставляет информации о времени следующего срабатывания, воспользуемся более подходящими инструментами.
Для определения следующего времени срабатывания таймера используйте команду:
systemctl list-timers --all
Эта команда предоставит детальную информацию обо всех активных таймерах, включая следующие ключевые моменты:
NEXT
: Когда таймер сработает в следующий раз.LEFT
: Осталось времени до следующего срабатывания.LAST
: Когда таймер сработал в последний раз.PASSED
: Время, прошедшее с последнего срабатывания.
Для более специфического поиска, можно использовать команду:
systemctl list-timers snapbackend.timer
Однако, если вы интегрируете это в скрипт и требуется точное вычисление времени, примените команду systemctl show
для получения информации о таймере:
systemctl show snapbackend.timer | awk -F= '$1 == "NextElapseUSecRealtime" { print $2 }'
Этот вывод предоставляет прямую информацию о следующем времени срабатывания в формате UNIX-времени, что может быть полезным для дальнейшей обработки в скриптах.
Заключение
Понимание механизма переопределения и точного вычисления времени срабатывания таймера systemd необходимо для успешного управления задачами на сервере. Совмещая теоретические знания с практическими примерами и конкретными командами, вы можете максимально эффективно использовать возможности таймеров systemd для автоматизации процессов. Важно уделять внимание деталям, таким как сброс параметров перед изменением, чтобы избежать неожиданных результатов и обеспечить ожидаемое поведение ваших приложений и служб.