Saya ingin tahu apakah ada cara Systemd
untuk me-restart A.service
( After
) ketika B.service
memulai atau memuat ulang (hanya memuat konfigurasi), jika mungkin tanpa mengedit B.service
yang diinstal dan ditingkatkan oleh sistem.
A.service
harus dimulai meskipun B.service
tidak diinstal, dinonaktifkan, atau dihentikan.
A.service
:
[Unit]
After = B.service network-online.target
Wants = B.service
[Service]
Type=oneshot
ExecStart = /script.sh start
ExecStop = /script.sh stop
RemainAfterExit=yes
[Install]
WantedBy = network-online.target
B.service
:
[Unit]
After=syslog.target network.target
[Service]
Type=forking
ExecStart=/cmd start
ExecStop=/cmd stop
ExecReload=/cmd reload
PIDFile=/var/run/cmd.pid
[Install]
WantedBy=multi-user.target
Overriding vendor settings
tetapi ini terlihat lebih mudah dan menjanjikan, hanya pengecualian saya tidak inginA
berhenti jikaB
berhenti, hanyaA.restart
jikaB.start
, bagaimanapun saya akan segera melakukan tes dan melihat apakah ada cara untuk mengelolanya, maka akan memberi tahu AndaPartOf
danRestart=always
bersama?Restart=
dokumentasi, saya tidak yakin apa perilaku denganoneshot
layanan, tetapi terlepas dari:,When the death of the process is a result of systemd operation (e.g. service stop or restart), the service will not be restarted
jika saya mengerti dengan benar, menghentikan B akan menghentikan APartOf
bukan solusi untuk pertanyaan itu, selamat menikmati.PartOf
denganRestart=always
? Apakah Anda sudah mencobanya?Saya tidak punya kendali
stop
denganPartOf=
, danA
tidak boleh berhentiB
, jadi saya akhirnya menggunakan pengaturan vendor Overriding , tampaknya berhasil./etc/systemd/system/B.service.d/override.conf
/cmd
implementasi asynchronous dan mengakses sumber daya yang/script.sh
perlu mengakses juga, saya menemukan tidak ada yang lebih baik (untuk saat ini) untuk tidur beberapa detik.Saya mencoba menggunakan
systemctl [--no-block] try-restart
sebelum menggunakan/script.sh
secara langsung tetapi tidak berhasil.sumber
man systemd.unit
(atau cari online jika tidak diinstal) dan cari bab "Mengesampingkan pengaturan vendor".Saat ini systemd tidak membahas senario ini. Anda tidak dapat mencapai fungsi ini hanya melalui file layanan. Satu kemungkinan adalah untuk membajak systemctl melalui skrip shell dengan nama yang sama dan di cek itu untuk melihat apakah B.service akan kembali / dimulai atau dimuat ulang, lakukan tindakan yang sesuai dengan A.service juga, dan jika perlu perbarui rc.local untuk mendapatkan status yang tepat saat boot juga. Saya memiliki masalah ini dengan docker.service dan networking.service, tapi saya selalu me-restart bersama:
Jelas, ini tidak akan efektif jika systemd itu sendiri memanipulasi layanan B. secara internal (misalnya melalui file layanan lainnya.).
sumber