Bagaimana cara mengirim email jika layanan systemd dimulai kembali?


8

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?


2
Saya tidak tahu bagaimana melakukannya dengan systemd, tetapi dengan monit Anda dapat melihatnya menonton suatu proses, dan itu dapat mengirimkan pemberitahuan jika id proses berubah.
Zoredache

Jawaban:


16

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 .servicekita 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.servicememverifikasi bahwa Anda dapat menerima email.

Kemudian cukup edit layanan yang Anda inginkan untuk email dan tambahkan OnFailure=status-email-user@%n.serviceke [Unit]bagian. %nmeneruskan nama unit ke templat.

Sumber: archlinux wiki: timer sistemd MAILTO


Tetapi @Dave tidak memerlukan layanan lain. Dia ingin layanan yang sudah dia gunakan untuk dapat mengirim email pada setiap awal / restart. Untuk itu, ada opsi ExecStartPost.
Jaroslav Kucera

@JaroslavKucera Saya pikir ini untuk memutuskannya ke OP ... :) Juga, saya tidak yakin apakah ExecStartPostini pilihan yang tepat: Ini juga akan memicu setelah awal yang "normal", tidak hanya jika terjadi kegagalan, kan ?
gf_

Saya tertarik mengapa suara turun ini dinaikkan - harap angkat suara Anda dan angkat bicara!
gf_

Karena pertanyaannya bukan tentang layanan lain, tetapi modifikasi layanan yang ada. Ya, ExecStartPost akan memicu pengiriman email bahkan di awal yang normal. Saya tidak mengetahui apa pun yang hanya akan berfungsi saat restart.
Jaroslav Kucera

@JaroslavKucera Yah, sepertinya OP tidak setuju, tapi tentu saja, simpan pendapat Anda.
gf_

2

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-failuredalam 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 ExecStopPostuntuk 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_RESULTadalah variabel lingkungan yang dipasok oleh systemd ke proses target ExecStopPost. Dengan memeriksa successhasilnya, 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:

  1. /superuser/1360346/how-to-send-an-email-alert-when-a-linux-service-has-stopped
  2. /unix/422933/confusing-systemd-behaviour-with-onfailure-and-restart
  3. /unix/197636/run-an-arbitrary-command-when-a-service-fails


-1

Anda dapat membuat skrip shell untuk memeriksa status layanan dan mengirim email saat server melakukan boot up. Tautan ini mungkin membantu Anda

/ubuntu/814/how-to-run-scripts-on-start-up


1
Pertanyaan ini bukan tentang booting, tetapi tentang restart layanan, yang mungkin terjadi beberapa saat setelah booting. Karena itu, saya tidak yakin apakah jawaban Anda dapat membantu.
gf_
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.