Системный таймер запланирован для первого запуска без ручного запуска или перезагрузки сервера
Задний план
У меня есть несколько (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