Системный таймер запланирован для первого запуска без ручного запуска или перезагрузки сервера

Задний план

У меня есть несколько (30+) настраиваемых сервисов / таймеров, которые имеют одинаковую структуру (ниже в разделе «Содержание»), но разные тайминги. Они должны выполняться только тогда, когда они запланированы, и не могут запускаться вручную в произвольное время. Приложение, стоящее за этими заданиями, часто обновляется, и во время обновления эти задания должны быть отключены / остановлены и повторно включены / запущены по расписанию после обновления.

Вопрос

Я создал новые системные файлы таймера / службы и поместил их в папку. Как мне запланировать это для первого запуска на основе OnCalendar без ручного запуска таймера или перезагрузки сервера?

СОДЕРЖАНИЕ

У меня есть служебный файл:

      # /etc/systemd/system/dummy.service
[Unit]
Description=dummy Service
Wants=dummy.timer

[Service]
Type=oneshot
User=root
ExecStart=/bin/ping -c 30 8.8.8.8
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

И соответствующий таймер:

      # /etc/systemd/system/dummy.timer
[Unit]
Description=dummy Timer
Requires=dummy.service

[Timer]
Unit=dummy.service
OnCalendar=*-*-* *:00:00
AccuracySec=1ms
RandomizedDelaySec=0

[Install]
WantedBy=timers.target

Они размещены в /etc/systemd/system/ а затем я запускаю следующие команды, чтобы включить таймер:

      systemctl daemon-reload
systemctl enable dummy.timer

И если я убегу systemctl list-timers --all 'dummy*', вывод такой, как показано ниже, и таймер никогда не срабатывает ..

      NEXT LEFT LAST PASSED UNIT        ACTIVATES    
n/a  n/a  n/a  n/a    dummy.timer dummy.service

Единственный способ заставить его работать по расписанию - это либо перезагрузить сервер (что не вариант), либо вручную запустить таймер с помощью systemctl start dummy.timer, что мне тоже не нужно.

Я уже довольно давно искал решение, и все, что я смог найти, это либо запустить вручную, либо перезагрузиться. Найдя что-нибудь на страницах руководства SystemD ...

Обходной путь, который у меня есть, использует systemd-analyze calendar читать следующее время выполнения, date чтобы преобразовать его в формат%Y%m%d%H%M, а затем запланировать его с помощью linux atкоманда. Это далеко не элегантно и имеет проблемы с заданиями, которые выполняются один раз в неделю или один раз в месяц, а сервер перезагружается после обновления приложения и до запланированного времени выполнения.

Любые идеи?

Спасибо!

1 ответ

Ах, нашел ответ сразу после комментирования.

Таймер неявно привязан к одноименной службе. строка в определении таймера заставляет его запускать службу. Если вы удалите эту строку, а затем включите/запустите таймер, он будет срабатывать только по расписанию. Не при загрузке и не при запуске, т.е.

      systemctl enable --now dummy.timer
Другие вопросы по тегам