Назад | Перейти на главную страницу

Запустить остановленную службу из-за обновления зависимости

У меня есть две службы systemd: postgresql.service и app.service. postgresql.service предоставляется дистрибутив (ubuntu 15.10) и app.service написано мной.

поскольку app потребности postgresql, сервис выглядит так:

[Unit]
Description=Start App

Requires=postgresql.service
After=postgresql.service

[Install]
WantedBy=multi-user.target

[Service]
Restart=always
ExecStart=/path/to/app

Сегодня обновился postgresql. Конечно, он перезапустил postgresql.service после обновления автоматически. Но это убило мою app.service, потому что это требует postgresql:

# systemctl status app
[...]
Apr 08 12:04:42 host systemd[1]: Stopping Start App...
Apr 08 12:04:42 host systemd[1]: Stopped Start App.

Apr 08 12:04:42 время, когда обновление postgresql получилось.

Как я могу изменить app.service чтобы его просто не убили, когда postgresql перезапускается, но (повторно) запускается автоматически (конечно, только когда он включен)?

Или спросить по-другому: как я могу настроить app.service что он всегда автоматически запускается после postgresql.service когда app.service включен? Так что в основном systemctl start postgresql первые старты postgresql а затем автоматически app.

Я думаю, что systemd хочет, чтобы я использовал Wants вместо того Requires. Из руководства:

Требуется =

Настраивает зависимости требований от других модулей. Если этот отряд активируется, перечисленные здесь юниты также будут активированы. Если один из других блоков будет деактивирован или его активация не удастся, это устройство будет деактивировано. [...] Часто лучше использовать Wants = вместо Requires =, чтобы получить более надежную систему при работе с неисправными службами.

Теперь используя Wants и это похоже на то, что я действительно хочу иметь надежную систему, работающую с отказавшими службами. Так и делаю.

Вы могли бы добавить postgresql.service к вашим услугам WantedBy

[Unit]
Description=Start App

Requires=postgresql.service
After=postgresql.service

[Install]
WantedBy=multi-user.target postgresql.service

[Service]
Restart=always
ExecStart=/path/to/app

не забывай systemctl reenable app.service после systemctl daemon-reload чтобы позволить systemd создать новую символическую ссылку