Рейтинг:2

Таймер не запускается командой userdata после перезагрузки

флаг co

Описание проблемы:

При загрузке мы запускаем сценарий инициализации службы, показанный ниже. Скрипт является частью экземпляра Данные пользователя.

Этот скрипт копирует необходимые сервисы/таймеры в системад папку и запускает таймер.

Время от времени после перезагрузки наши таймеры не работают и остаются в Н/Д.

sudo systemctl перезапустить cleanup.timer команда не помогает.

Только судо systemctl остановить cleanup.timer а потом sudo systemctl запустить cleanup.timer работает.

У нас эта проблема не только с конкретным таймером. У нас есть много таймеров с почти одинаковой структурой и сервисом инициализации. Все таймеры загружены, но некоторые из них могут активен (истёк) статус и не работает.

Наша установка:

Мы бежим Убунту 18.04 ЛТС.

У нас есть этот скрипт инициализации службы:

sudo cp <ОСНОВНОЙ ПУТЬ>/services/cleanup.service/etc/systemd/system/cleanup.service
sudo cp <ОСНОВНОЙ ПУТЬ>/services/cleanup.timer /etc/systemd/system/cleanup.timer
sudo systemctl демон-перезагрузка
sudo systemctl запустить cleanup.timer

И это уборка.сервис:

[Ед. изм]
Description=Сервис для очистки вещей
Требует = docker.service
После=докер.сервис

[Оказание услуг]
ExecStart=<<КОМАНДА ОБОЛОЧКИ>>

И это очистка.таймер:

[Ед. изм]
Description=Таймер службы по уборке вещей

[Таймер]
OnBootSec=1мин
OnUnitActiveSec=1800 сек.
Точность сек = 5 сек

[Установить]
WantedBy=timers.target

Теперь проверьте эти команды:

> список таймеров sudo systemctl
СЛЕДУЮЩИЙ СЛЕВА ПОСЛЕДНИЙ ПРОЙДЕННЫЙ БЛОК АКТИВИРУЕТСЯ
н/д н/д н/д н/д cleanup.timer cleanup.service
> статус sudo systemctl cleanup.timer
• cleanup.timer — Таймер службы очистки вещей
   Загружено: загружено (/etc/systemd/system/cleanup.timer; отключено; предустановка поставщика: включена)
   Активен: активен (истёк) с 17.11.2021 21:07:22 UTC; 11 часов назад
  Триггер: н/д

17 ноября, 21:07:22 ip-XX-XX-XX-XX systemd[1]: запущен таймер для службы очистки вещей.

Вопрос:

С чем может быть связана такая ситуация и как ее избежать?

Рейтинг:1
флаг jp

похоже ты забыл включить таймер.

systemctl start <устройство> запускает этот таймер прямо сейчас (то есть, когда вы впервые устанавливаете его и хотите, чтобы он работал).

systemctl включить <устройство> не запускает модуль сейчас, но устанавливает соответствующие хуки, поэтому модуль запускается на основе того, что находится в файле модуля...

например таймер запустится после перезагрузки из-за...

[Установить]
WantedBy=timers.target

запуск сценария инициализации службы при каждой загрузке?

При загрузке мы запускаем скрипт инициализации службы... У нас есть этот скрипт инициализации службы:

Это явно не работает успешно, потому что скрипт инициализации предположительно работает systemctl запустить cleanup.timer но cleanup.timer не запускался или не работал в течение 11 часов.

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

флаг co
Насколько я понял из документации, основным преимуществом «включить» было сохранение перезагрузки, поэтому служба будет автоматически запускаться системой. Но поскольку сценарии `User data` запускаются при каждой загрузке, я не вижу причин делать `enable`. В любом случае спасибо, проверим и протестируем. О `скрипте инициализации службы при каждой загрузке`. Каждый из них содержит `set -e` в начале скрипта. Таким образом, он должен завершиться ошибкой, если какая-либо из следующих команд завершится с ненулевым статусом, но этого не произошло.
флаг co
О «Может быть, ваш скрипт инициализации запущен до того, как докер станет доступен или что-то в этом роде».Это странно, потому что все мои службы systemctl содержат параметры `Requires=` и `After=`, и это должно заставлять службы ждать, пока необходимое не будет доступно. Также были ситуации, когда в одно и то же время часть сервисов с одинаковыми настройками работала нормально, а часть нет.
mattpr avatar
флаг jp
Я могу комментировать только то, что очевидно из того, что вы написали. Ваш сценарий инициализации говорит запустить таймер, но `journalctl -u ` показывает, что он не запускался в течение 11 часов. Таким образом, либо `systemctl`/`journalctl` неверны (маловероятно), либо ваш сценарий инициализации по какой-то причине фактически не запускает таймер (что более вероятно). Поэтому я бы добавил больше отладки/регистрации в ваш сценарий инициализации и взглянул на это после серии перезагрузок. Если вы можете опубликовать больше, я мог бы помочь больше.
Рейтинг:0
флаг ru

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

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.