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.

Nama tampilan
sumber
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 [email protected]layanan 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

Pablo Martinez
sumber
5
Ada beberapa koreksi yang diperlukan untuk instruksi di situs tertaut. Pertama, notify%n.serviceberlebihan, dan akan menghasilkan [email protected]. 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/[email protected]

[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" [email protected]'

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
ceinmart
sumber
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