Bagaimana cara mendapatkan layanan systemd saya restart ketika ketergantungannya ditingkatkan

11

Saya telah menulis sebuah program yang menggunakan database Postgres, dan saya menulis file layanan systemd untuk itu. Saat ini layanan saya memulai boot dengan baik, dan terhenti ketika Postgres dihentikan untuk peningkatan (oleh apt upgrade). Namun, ketika pembaruan selesai dan Postgres dimulai lagi, layanan saya tidak secara otomatis dimulai.

Bisakah saya mendefinisikan beberapa ketergantungan untuk memulai layanan saya secara otomatis?

Ini adalah status layanan saya setelah dihentikan secara otomatis selama peningkatan 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)

Perhatikan bahwa saya dapat secara manual memulai layanan lagi dengan baik.

Ini file layanan saya:

[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

Saya sudah mencoba menambahkan PartOf=postgresql.servicedan BindsTo=postgresql.service, kemudian secara manual menghentikan dan memulai Postgres, tetapi tidak ada yang membantu.

Tentu saja saya bisa menghapus Requires, tetapi menghentikan kedua layanan bersama lebih disukai, jika saja mereka berdua akan mulai kembali.

Rennex
sumber
PartOf=terdengar seperti solusi yang tepat. Apakah Anda mencobanya dengan Requires=dihapus?
meuh
@meuh saya mencobanya sekarang dengan Requires=dihapus, itu tidak membantu. Saya pikir masalahnya adalah PartOf=tautan "menghentikan dan memulai kembali unit", tetapi Postgres tidak dimulai kembali saat peningkatan. Berhenti, ditingkatkan, dan dimulai.
Rennex
Cukup mengherankan, ketika Anda melakukannya systemctl restart postgresql, systemd ingat untuk memulai kembali layanan dependennya lagi. Sepertinya tepat, untuk beberapa alasan, melakukan kombinasi stopdan startbukan restart.
WGH

Jawaban:

13

Saya menemukan jawabannya: Saya perlu mengubah baris terakhir dari file layanan ke:

WantedBy=postgresql.service

Dengan cara ini, setiap kali Postgres dimulai, layanan saya juga mulai - tetapi jika layanan saya gagal, itu tidak menghentikan Postgres.

Arahan di [Install]bagian ini hanya memengaruhi mengaktifkan dan menonaktifkan unit. Tapi itu tidak sesederhana ini ketika layanan saya sudah diaktifkan:

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

Pesan kesalahan itu menyesatkan. Memperbaiki itu sederhana:

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

Sekarang layanan saya berhenti dan mulai setiap kali Postgres melakukannya. Dan secara alami Postgres dimulai ketika sistem melakukan boot.

Rennex
sumber