Saya memiliki aplikasi kritis yang dijalankan sebagai layanan oleh systemd.
Sudah diatur untuk memulai kembali segera setelah ada kegagalan.
Bagaimana cara mengirim email jika aplikasi restart?
Saya memiliki aplikasi kritis yang dijalankan sebagai layanan oleh systemd.
Sudah diatur untuk memulai kembali segera setelah ada kegagalan.
Bagaimana cara mengirim email jika aplikasi restart?
Jawaban:
Pertama, Anda memerlukan dua file: file yang dapat dieksekusi untuk mengirim surat dan layanan. Untuk memulai file yang dapat dieksekusi. Untuk contoh ini, executable hanyalah skrip shell menggunakan sendmail
:
/usr/local/bin/systemd-email:
#!/bin/bash
/usr/bin/sendmail -t <<ERRMAIL
To: $1
From: systemd <root@$HOSTNAME>
Subject: $2
Content-Transfer-Encoding: 8bit
Content-Type: text/plain; charset=UTF-8
$(systemctl status --full "$2")
ERRMAIL
Apa pun yang dapat dieksekusi yang Anda gunakan, mungkin perlu setidaknya dua argumen seperti script shell ini: alamat untuk mengirim dan file unit untuk mendapatkan status. The .service
kita buat akan melewati argumen ini:
/etc/systemd/system/status-email-user@.service:
[Unit]
Description=status email for %i to user
[Service]
Type=oneshot
ExecStart=/usr/local/bin/systemd-email address %i
User=nobody
Group=systemd-journal
Di mana pengguna adalah pengguna yang diemail dan alamat adalah alamat email pengguna itu. Meskipun penerima adalah hard-coded, file unit untuk dilaporkan dilewatkan sebagai parameter instance, sehingga layanan yang satu ini dapat mengirim email ke banyak unit lainnya. Pada titik ini Anda dapat mulai status-email-user@dbus.service
memverifikasi bahwa Anda dapat menerima email.
Kemudian cukup edit layanan yang Anda inginkan untuk email dan tambahkan OnFailure=status-email-user@%n.service
ke [Unit]
bagian. %n
meneruskan nama unit ke templat.
ExecStartPost
ini pilihan yang tepat: Ini juga akan memicu setelah awal yang "normal", tidak hanya jika terjadi kegagalan, kan ?
Solusi yang diajukan oleh @gf_ bekerja dengan baik untuk situasi kami menjalankan clickhouse di CentOS7. Clickhouse mogok agak sering pada kami sehingga kami harus menjalankannya kembali secara otomatis dan diberi tahu saat restart terjadi. Meskipun agak kikuk untuk menambahkan layanan kedua ke systemd, ini diperlukan karena desain systemd.
Yang sedang berkata, solusi ini, ketika dikombinasikan dengan auto-restart, berhenti bekerja untuk kami ketika kami digunakan untuk CentOS8. Ini karena systemd v239 yang dikirim dalam C8 memperkenalkan perubahan ke OnFailure=
semantik ketika dikombinasikan dengan konfigurasi non-default Restart=
( Restart=on-failure
dalam kasus kami). OnFailure=
Perilaku baru hanya memicu layanan sekali pakai jika restart gagal sepenuhnya, tidak hanya setelah crash. Perilaku yang lebih baru ini akan dengan senang hati memulai kembali layanan, tetapi kami tidak akan mendapatkan email karena OnFailure=
tidak lagi dipanggil.
Perhatikan harapan utama kami: kami ingin systemd memulai kembali proses DAN mengirim pemberitahuan email. Pembaruan v239 membuat solusi kami sebelumnya yang dikutip oleh gf_ tidak berfungsi lagi. Untungnya kami berhasil.
Solusi kami adalah gunakan ExecStopPost
untuk menjalankan skrip notifikasi email. Ini berfungsi dengan baik, tetapi sekarang masalah baru muncul: pemberitahuan email dikirim ketika layanan clickhouse dimulai secara normal, seperti pada startup server. Meskipun bukan masalah besar, idealnya kami ingin mendapatkan notifikasi email hanya pada crash. Kami dapat mencapai ini dengan menambahkan kode berikut ke skrip email kami:
# Don't do anything if the service intentionally stopped successfully.
if [ $SERVICE_RESULT == "success" ]; then
exit
fi
... $SERVICE_RESULT
adalah variabel lingkungan yang dipasok oleh systemd ke proses target ExecStopPost
. Dengan memeriksa success
hasilnya, kami menganggap bahwa permohonan ini berasal dari startup normal, atau shutdown, dan tidak melakukan apa pun. Pada nilai lain, seperti signal
, skrip akan melanjutkan pengiriman email. Nilai-nilai yang mungkin dari variabel ini dinyatakan dalam dokumentasi .
Terima kasih kepada gf_ untuk solusi awal. Saya harap orang-orang menemukan pembaruan saya bermanfaat untuk CentOS8. Beberapa tautan yang membantu saya:
Anda dapat mencoba menggunakan opsi layanan systemd ExecStartPost.
Deskripsi tersedia di sini:
https://www.freedesktop.org/software/systemd/man/systemd.service.html
Ada lebih banyak deklarasi opsi ini di file definisi layanan. Itu dipicu satu per satu.
Anda juga akan memiliki beberapa contoh di sistem Anda.
Anda dapat membuat skrip shell untuk memeriksa status layanan dan mengirim email saat server melakukan boot up. Tautan ini mungkin membantu Anda