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.service
dan 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.
sumber
PartOf=
terdengar seperti solusi yang tepat. Apakah Anda mencobanya denganRequires=
dihapus?Requires=
dihapus, itu tidak membantu. Saya pikir masalahnya adalahPartOf=
tautan "menghentikan dan memulai kembali unit", tetapi Postgres tidak dimulai kembali saat peningkatan. Berhenti, ditingkatkan, dan dimulai.systemctl restart postgresql
, systemd ingat untuk memulai kembali layanan dependennya lagi. Sepertinya tepat, untuk beberapa alasan, melakukan kombinasistop
danstart
bukanrestart
.Jawaban:
Saya menemukan jawabannya: Saya perlu mengubah baris terakhir dari file layanan ke:
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:Pesan kesalahan itu menyesatkan. Memperbaiki itu sederhana:
Sekarang layanan saya berhenti dan mulai setiap kali Postgres melakukannya. Dan secara alami Postgres dimulai ketika sistem melakukan boot.
sumber