Jak zrestartować moją usługę systemd po uaktualnieniu jej zależności


12

Napisałem program, który korzysta z bazy danych Postgres, i napisałem dla niego plik usługi systemd. Obecnie moja usługa dobrze się uruchamia przy rozruchu i zostaje zatrzymana, gdy Postgres zostanie zatrzymany w celu aktualizacji (przez apt upgrade). Jednak po zakończeniu aktualizacji i ponownym uruchomieniu Postgres moja usługa nie zostanie uruchomiona automatycznie.

Czy mogę zdefiniować pewną zależność, aby moja usługa została ponownie uruchomiona automatycznie?

To jest stan mojej usługi po jej automatycznym zatrzymaniu podczas aktualizacji 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)

Pamiętaj, że mogę ręcznie uruchomić usługę ponownie w porządku.

Oto mój plik usługi:

[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

Próbowałem dodawanie PartOf=postgresql.servicei BindsTo=postgresql.service, a następnie ręcznie zatrzymywania i uruchamiania PostgreSQL, ale nie pomogło.

Oczywiście mógłbym usunąć Requires, ale lepiej jest zatrzymać obie usługi razem, jeśli tylko obie zaczną od nowa.


PartOf=brzmi jak właściwe rozwiązanie. Próbowałeś go z Requires=usuniętym?
Meuh

@meuh Próbowałem teraz z Requires=usuniętym, to nie pomogło. Myślę, że problem polega na tym, że PartOf=linki „zatrzymują i restartują jednostki”, ale Postgres nie jest restartowany podczas aktualizacji. Został zatrzymany, zaktualizowany i uruchomiony.
Rennex

Co zabawne, kiedy to zrobisz systemctl restart postgresql, systemd pamięta, aby ponownie uruchomić swoje usługi zależne. Wydaje się, że z jakiegoś powodu trafna jest kombinacja stopi startzamiast restart.
WGH,

Odpowiedzi:


14

Znalazłem odpowiedź: musiałem zmienić ostatnią linię pliku usługi na:

WantedBy=postgresql.service

W ten sposób za każdym razem, gdy uruchamiany jest Postgres, uruchamiana jest również moja usługa - ale jeśli moja usługa zawiedzie, to nie zatrzymuje Postgres.

Dyrektywy w tej [Install]sekcji wpływają tylko na włączanie i wyłączanie jednostek. Ale to nie było takie proste, kiedy moja usługa była już włączona:

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

Komunikat o błędzie wprowadzał w błąd. Naprawienie tego było proste:

# 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.

Teraz moja usługa zatrzymuje się i uruchamia za każdym razem, gdy robi to Postgres. I oczywiście Postgres uruchamia się po uruchomieniu systemu.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.