Как перезапустить мой сервис systemd при обновлении его зависимости

11

Я написал программу, использующую базу данных 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, но остановка обоих сервисов предпочтительнее, если только они оба начнут резервное копирование.

Rennex
источник
PartOf=звучит как правильное решение. Вы пробовали это с Requires=удаленным?
meuh
@ meuh Я попробовал это сейчас с Requires=удаленным, это не помогло. Я думаю, что проблема в том, что PartOf=ссылки «остановка и перезапуск модулей», но Postgres не перезапускается во время обновления. Он остановлен, обновлен и запущен.
Rennex
Довольно забавно, что когда вы это делаете systemctl restart postgresql, systemd не забывает перезапускать зависимые сервисы снова. Похоже, что apt по какой-то причине делает комбинацию stopи startвместо restart.
WGH

Ответы:

13

Я нашел ответ: мне нужно было изменить последнюю строку служебного файла на:

WantedBy=postgresql.service

Таким образом, всякий раз, когда запускается Postgres, запускается и мой сервис, но если мой сервис выходит из строя, это не останавливает Postgres.

Директивы в [Install]разделе влияют только на включение и отключение юнитов. Но это было не так просто, когда мой сервис уже был включен:

# systemctl enable tabill.service
Failed to execute operation: Too many levels of symbolic links

Сообщение об ошибке вводило в заблуждение. Исправить это было просто:

# systemctl disable tabill.service
Removed symlink /etc/systemd/system/tabill.service.
Removed symlink /etc/systemd/system/multi-user.target.wants/tabill.service.

# systemctl enable tabill.service
Failed to execute operation: No such file or directory

# systemctl enable /srv/tabill/tabill.service
Created symlink from /etc/systemd/system/postgresql.service.wants/tabill.service to /srv/tabill/tabill.service.
Created symlink from /etc/systemd/system/tabill.service to /srv/tabill/tabill.service.

Теперь мой сервис останавливается и запускается всякий раз, когда это делает Postgres. И естественно Postgres запускается при загрузке системы.

Rennex
источник