Я написал программу, использующую базу данных Postgres, и написал для нее файл службы systemd. В настоящее время мой сервис запускается при загрузке просто отлично, и он останавливается, когда Postgres останавливается для обновления (by apt upgrade
). Однако, когда обновление завершено и Postgres запущен снова, моя служба не запускается автоматически.
Могу ли я определить некоторую зависимость для автоматического запуска моего сервиса?
Это состояние моей службы после того, как она автоматически остановилась во время обновления Postgres:
● tabill.service - My service
Loaded: loaded (/srv/tabill/tabill.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Tue 2017-07-04 00:29:24 EEST; 44min ago
Main PID: 1048 (code=killed, signal=TERM)
Обратите внимание, что я могу вручную запустить службу снова просто отлично.
Вот мой сервисный файл:
[Unit]
Description=My service
Wants=nginx.service
Requires=postgresql.service
After=postgresql.service
[Service]
Type=simple
ExecStart=/srv/tabill/app/serve
Restart=always
TimeoutSec=60
[Install]
WantedBy=multi-user.target
Я пытался добавить PartOf=postgresql.service
и BindsTo=postgresql.service
, а затем вручную остановить и запустить Postgres, но ни один не помог.
Конечно, я мог бы удалить Requires
, но остановка обоих сервисов предпочтительнее, если только они оба начнут резервное копирование.
источник
PartOf=
звучит как правильное решение. Вы пробовали это сRequires=
удаленным?Requires=
удаленным, это не помогло. Я думаю, что проблема в том, чтоPartOf=
ссылки «остановка и перезапуск модулей», но Postgres не перезапускается во время обновления. Он остановлен, обновлен и запущен.systemctl restart postgresql
, systemd не забывает перезапускать зависимые сервисы снова. Похоже, что apt по какой-то причине делает комбинациюstop
иstart
вместоrestart
.Ответы:
Я нашел ответ: мне нужно было изменить последнюю строку служебного файла на:
Таким образом, всякий раз, когда запускается Postgres, запускается и мой сервис, но если мой сервис выходит из строя, это не останавливает Postgres.
Директивы в
[Install]
разделе влияют только на включение и отключение юнитов. Но это было не так просто, когда мой сервис уже был включен:Сообщение об ошибке вводило в заблуждение. Исправить это было просто:
Теперь мой сервис останавливается и запускается всякий раз, когда это делает Postgres. И естественно Postgres запускается при загрузке системы.
источник