Saya telah membaca manual layanan systemd beberapa kali, tetapi saya masih tidak dapat menemukan pola dasar systemd:
Saya ingin menjalankan proses startup sekali (seperti wadah buruh pelabuhan, atau memformat drive) saat boot, berhasil selesai. Tetapi jika saya menggunakan Type = oneshot untuk itu, maka saya tidak bisa menggunakan Restart = on-failure, dan jika gagal, maka tidak akan mencoba lagi pekerjaan itu. Apakah saya melewatkan sesuatu yang jelas di sini?
Saya juga mencoba mengatur Type = simple dengan Restart = on-failure, tetapi dalam banyak kasus ini saya memerlukan perilaku berikut (dari halaman manual) yang diberikan oleh layanan oneshot:
Perilaku oneshot mirip dengan yang sederhana; namun, diharapkan proses tersebut harus keluar sebelum systemd memulai unit tindak lanjut.
Pembaruan:
Restart
dan membungkusmy_cmd
seperti iniExecStart=/bin/sh -c 'while ! my_cmd; do sleep 1; done'
:, bersama dengan beberapaTimeoutStartSec
nilai yang masuk akal .Restart=
dengan mengaturFailureAction=[self.unit]
(ganti [self.unit] dengan nama unit). Agak kasar, tapi setidaknya eksplisit dan cukup mudah untuk diikuti.FailureAction
mengambil nilai yang sama denganStartLimitAction
, dan semua kecualinone
memicu semacam shutdown.Jawaban:
Salah satu solusi yang mungkin saya coba adalah
Di mana skrip
tag.sh
akantouch /ack/TAG_SUCCESS
di akhir eksekusi. Saya percaya ini mendekati perilaku yang diinginkan karenaExecStartPre
akan secara berurutan mengeksekusi, menunggu penyelesaian yang berhasil sebelum meneleponExecStart
dan unit hanya dianggapStarting
satu kaliExecStart
dipanggil pada titik mana kami yakin kami telah menyelesaikan tugas startup.Tapi ini masih terasa seperti retasan raksasa?
sumber
RemainAfterExit=yes
agar unit tetap "aktif" sehingga unit lain dapat bergantung padanya.