Jalankan perintah sewenang-wenang ketika layanan gagal

11

Saya ingin menjalankan beberapa skrip ketika layanan gagal. Hal terdekat yang saya lihat adalah FailureAction=opsi (di bawah [Service]bagian), tetapi hanya menawarkan perintah reboot.

tepang
sumber

Jawaban:

11

Ada OnFailure=arahan dalam bagian [Unit], didokumentasikan dalam systemd.unit (5) . Ini didefinisikan sebagai berikut:

Daftar yang dipisahkan oleh spasi dari satu atau lebih unit yang diaktifkan ketika unit ini memasuki kondisi "gagal".

(Juga ada OnFailureJobMode=arahan di bagian yang sama yang memungkinkan untuk mengatur mode pekerjaan untuk mengaktifkan OnFailure = unit.)

intelfx
sumber
Sepertinya opsi itu memulai unit lain, bukan hanya skrip.
tshepang
2
@Tepang: Tentu saja. Dalam systemd, sebuah unit, well, merupakan unit dasar untuk melakukan apa saja. Tulis unit sederhana untuk skrip Anda, letakkan di bawah /etc/systemd/systemdan letakkan namanya dalam OnFailure=arahan.
intelfx
2

Anda juga dapat menggunakan ExecStopPostuntuk menjalankan perintah secara langsung alih-alih memulai sebuah unit.

Saya tidak senang dengan OnFailurepengaturan sehingga saya terus mencari dan menemukan ExecStopPost.

Contoh nyata berikut, jika tugas utama gagal maka systemd akan menjalankan gitperintah.

[Unit]
Description=SRI Dispenser Server
ConditionPathExists=|/usr/bin/
After=sri-boot-dsp.service

[Service]
WorkingDirectory=/usr/share/sri/configurations/transmitter

User=root

# This is task to run when this service starts
ExecStart=/usr/bin/python -m sri.DispenserServer

# If any of the ExecStart tasks fail, then ExecStopPost will run
ExecStopPost=/bin/git checkout -- .

Restart=always
RestartSec=10
KillSignal=SIGKILL


[Install]
WantedBy=multi-user.target

https://www.freedesktop.org/software/systemd/man/systemd.service.html

ExecStopPost = Perintah tambahan yang dijalankan setelah layanan dihentikan. Ini termasuk kasus-kasus di mana perintah yang dikonfigurasi dalam ExecStop = digunakan, di mana layanan tidak memiliki ExecStop = didefinisikan, atau di mana layanan keluar secara tidak terduga. Argumen ini mengambil beberapa baris perintah, mengikuti skema yang sama seperti yang dijelaskan untuk ExecStart =. Penggunaan pengaturan ini adalah opsional. Substitusi dan substitusi variabel lingkungan didukung. Perhatikan bahwa - tidak seperti ExecStop = - perintah yang ditentukan dengan pengaturan ini dipanggil ketika layanan gagal untuk memulai dengan benar dan dimatikan lagi.

Disarankan untuk menggunakan pengaturan ini untuk operasi pembersihan yang harus dijalankan bahkan ketika layanan gagal untuk memulai dengan benar. Perintah yang dikonfigurasikan dengan pengaturan ini harus dapat beroperasi walaupun layanan gagal memulai setengah jalan dan membiarkan data yang diinisialisasi tidak lengkap. Karena proses layanan sudah dihentikan ketika perintah yang ditentukan dengan pengaturan ini dijalankan, mereka tidak boleh mencoba untuk berkomunikasi dengan mereka.

Perhatikan bahwa semua perintah yang dikonfigurasi dengan pengaturan ini dipanggil dengan kode hasil layanan, serta kode keluar dan status proses utama, yang ditetapkan dalam variabel lingkungan $ SERVICE_RESULT, $ EXIT_CODE dan $ EXIT_STATUS, lihat systemd.exec (5) untuk detail.

shrewmouse
sumber