Описание проблемы:
При загрузке мы запускаем скрипт инициализации сервиса, показанный ниже. Скрипт является частью Instance User Data
.
Этот скрипт копирует необходимые сервисы/таймеры в папку systemd
и запускает таймер.
Время от времени после перезагрузки наши таймеры не работают и остаются в N/A
.
Команда sudo systemctl restart cleanup.timer
не помогает.
Работает только sudo systemctl stop cleanup.timer
и затем sudo systemctl start cleanup.timer
.
У нас эта проблема не только с конкретным таймером. У нас есть много таймеров с почти одинаковой структурой и сервисом инициализации. Все таймеры загружены, но некоторые из них могут находиться в состоянии active (elapsed)
и не работать.
Наша установка:
Запускаем Ubuntu 18.04 LTS
.
У нас есть этот скрипт инициализации сервиса:
sudo cp <BASIC PATH>/services/cleanup.service /etc/systemd/system/cleanup.service
sudo cp <BASIC PATH>/services/cleanup.timer /etc/systemd/system/cleanup.timer
sudo systemctl daemon-reload
sudo systemctl start cleanup.timer
И этотcleanup.service
:
[Unit]
Description=Service to cleanup things
Requires=docker.service
After=docker.service
[Service]
ExecStart=<<SHELL COMMAND>>
И этотcleanup.timer
:
[Unit]
Description=Timer for service to cleanup things
[Timer]
OnBootSec=1min
OnUnitActiveSec=1800sec
AccuracySec=5sec
[Install]
WantedBy=timers.target
Теперь проверим эти команды:
> sudo systemctl list-timers
NEXT LEFT LAST PASSED UNIT ACTIVATES
n/a n/a n/a n/a cleanup.timer cleanup.service
> sudo systemctl status cleanup.timer
● cleanup.timer - Timer for service to cleanup things
Loaded: loaded (/etc/systemd/system/cleanup.timer; disabled; vendor preset: enabled)
Active: active (elapsed) since Wed 2021-11-17 21:07:22 UTC; 11h ago
Trigger: n/a
Nov 17 21:07:22 ip-XX-XX-XX-XX systemd[1]: Started Timer for service to cleanup things.
Вопрос:
С чем может быть связана такая ситуация и как этого избежать?
Похоже, вы забыли enable
таймер.
systemctl start <unit>
запускает этот таймер прямо сейчас (, т.е. когда вы впервые устанавливаете его и хотите, чтобы он работал).
systemctl enable <unit>
не запускает модуль сейчас, но устанавливает соответствующие хуки, чтобы модуль запускался на основе того, что находится в файле модуля...
например. таймер запустится после перезагрузки из-за...
[Install]
WantedBy=timers.target
При загрузке запускаем скрипт инициализации сервиса... У нас есть этот сценарий инициализации службы :
. Очевидно, что он не работает успешно, потому что сценарий инициализации предположительно работает systemctl start cleanup.timer
, но cleanup.timer не запустился или дал сбой в течение 11 часов.
Итак, я бы посмотрел журналы вокруг вашего скрипта инициализации, чтобы увидеть, что не получается и почему. Может быть, ваш скрипт инициализации запущен до того, как докер станет доступен или что-то в этом роде.
Я еще не знаком с systemd, но, насколько я знаю, среда PATH еще недоступна при загрузке-, поэтому некоторые скрипты и программы сначала устанавливают среду PATH. Предполагая, что ваша служба запускается всякий раз, когда вы запускаете ее на консоли, так будет всегда.