Як запустити свою систему 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.