dapatkan pemberitahuan ketika layanan yang dipantau systemd memasuki kondisi gagal


32

Saya perlu memiliki pesan jaringan yang dikirim ketika layanan systemd saya crash atau digantung (yaitu, memasuki kondisi gagal; Saya memantau hang dengan menggunakan WatchdogSec =). Saya perhatikan bahwa systemd yang lebih baru memiliki FailureAction =, tetapi kemudian melihat bahwa ini tidak memungkinkan perintah sewenang-wenang, tetapi hanya me-reboot / mematikan.

Secara khusus, saya perlu cara untuk mengirim satu pesan jaringan ketika systemd mendeteksi program macet, dan lainnya ketika mendeteksi pesan telah digantung.

Saya berharap jawaban yang lebih baik daripada "parsing log", dan saya butuh sesuatu yang memiliki waktu respon hampir instan, jadi saya tidak berpikir pendekatan polling itu baik; itu harus menjadi sesuatu yang dipicu oleh peristiwa yang terjadi.


Bisakah Anda memberikan contoh (bahkan yang tidak berfungsi) tentang apa yang ingin Anda capai?
dawud

Bisakah Anda mengedit pertanyaan Anda untuk menambahkan informasi ini daripada menambahkannya dalam komentar? :)
dawud

Jawaban:


31

unit systemd mendukung OnFailure yang akan mengaktifkan unit (atau lebih) ketika unit gagal. Anda dapat meletakkan sesuatu seperti

 OnFailure=notify-failed@%n

Dan kemudian buat notify-failed@.servicelayanan di mana Anda dapat menggunakan specifier yang diperlukan (Anda mungkin ingin setidaknya% i) untuk meluncurkan skrip atau perintah yang akan mengirim pemberitahuan.

Anda dapat melihat contoh praktis di http://northernlightlabs.se/systemd.status.mail.on.unit.failure


5
Ada beberapa koreksi yang diperlukan untuk instruksi di situs tertaut. Pertama, notify%n.serviceberlebihan, dan akan menghasilkan notify@my-service.service.service. Kedua,%i harus digunakan sebagai ganti %I, atau semua tanda hubung dalam nama akan dikonversi menjadi garis miring.
orodbhen

4
Apakah ada cara untuk melakukan ini untuk banyak atau semua unit, tanpa memodifikasi file unit mereka?
Vladimir Panteleev

16

Hanya cara saya untuk memberi tahu:

/etc/systemd/system/notify-email@.service

[Unit]
Description=Sent email 

[Service]
Type=oneshot
ExecStart=/usr/bin/bash -c '/usr/bin/systemctl status %i | /usr/bin/mailx -Ssendwait -s "[SYSTEMD_%i] Fail" your_admin@company.blablabla'

tambahkan ke systemd:

systemctl enable /etc/systemd/system/notify-email@service

Di layanan lain tambahkan:

[Unit]
OnFailure=notify-email@%i.service

Muat ulang konfigurasi:

systemctl daemon-reload

Apakah ada cara untuk menghindari pemicunya berkali-kali berturut-turut? Dalam beberapa situasi menerima email 1K tentang layanan yang gagal di malam hari dan mencoba berulang kali untuk memulai kembali sendiri tidak membantu.
starbeamrainbowlabs

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.