Як запустити свою систему systemd, коли її залежність буде оновлена


11

Я написав програму, яка використовує базу даних Postgres, і я написав файл системного сервісу для неї. Наразі мій сервіс починає завантажуватися просто чудово, і він зупиняється, коли 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=видаленим?
meuh

@meuh Я спробував це зараз із Requires=видаленим, що не допомогло. Я думаю, що проблема полягає в тому, що PartOf=посилання "зупиняють і перезапускають одиниці", але Postgres не перезапускається під час оновлення. Це зупинено, оновлено та розпочато.
Rennex

Забавно, коли це робити systemctl restart postgresql, systemd запам'ятовує знову запустити свої залежні служби. Здається, що влучна чомусь робить комбінацію 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 починається, коли система завантажується.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.