Řešení 1:
Nejprve potřebujete dva soubory:spustitelný soubor pro odeslání pošty a službu .service pro spuštění spustitelného souboru. V tomto příkladu je spustitelný soubor pouze skript shellu používající sendmail
:
/usr/local/bin/systemd-email:
#!/bin/bash
/usr/bin/sendmail -t <<ERRMAIL
To: $1
From: systemd <[email protected]$HOSTNAME>
Subject: $2
Content-Transfer-Encoding: 8bit
Content-Type: text/plain; charset=UTF-8
$(systemctl status --full "$2")
ERRMAIL
Ať už použijete jakýkoli spustitelný soubor, pravděpodobně by měl mít alespoň dva argumenty, jako to dělá tento skript shellu:adresu, kam se má odeslat, a soubor jednotky, jehož stav se má získat. .service
vytvoříme předá tyto argumenty:
/etc/systemd/system/[email protected]:
[Unit]
Description=status email for %i to user
[Service]
Type=oneshot
ExecStart=/usr/local/bin/systemd-email address %i
User=nobody
Group=systemd-journal
Kde uživatel je uživatel, kterému je zaslán e-mail, a adresa je e-mailová adresa tohoto uživatele. Přestože je příjemce pevně zakódován, soubor jednotky, o kterém se má hlásit, je předán jako parametr instance, takže tato jediná služba může odesílat e-maily mnoha dalším jednotkám. V tomto okamžiku můžete začít [email protected]
abyste ověřili, že můžete přijímat e-maily.
Poté jednoduše upravte službu, pro kterou chcete e-maily, a přidejte [email protected]%n.service
na [Unit]
sekce. %n
předá název jednotky šabloně.
Zdroj:archlinux wiki:systemd timers MAILTO
Řešení 2:
Řešení navržené @gf_ fungovalo dobře pro naši situaci s provozem clickhouse na CentOS7. Clickhouse na nás poněkud pravidelně padá, takže jsme potřebovali, aby se automaticky restartoval a byl upozorněn, když k restartu došlo. I když se zdá být trochu neohrabané přidat druhou službu do systemd, je to nutné kvůli designu systemd.
Jak již bylo řečeno, toto řešení v kombinaci s automatickým restartováním nám přestalo fungovat, když jsme nasadili CentOS8. Je to proto, že systemd v239 dodávaný v C8 zavedl změnu v OnFailure=
sémantiku v kombinaci s jinou než výchozí konfigurací Restart=
(Restart=on-failure
v našem případě). Nový OnFailure=
chování spustí jednorázovou službu pouze v případě, že restart selhal úplně, nejen po havárii. Toto novější chování by šťastně restartovalo službu, ale nedostali bychom e-mail jako OnFailure=
již nebylo vyvoláno.
Všimněte si našeho primárního očekávání:chtěli jsme, aby systemd restartoval proces A poslal e-mailové upozornění. Aktualizace v239 způsobila, že naše předchozí řešení citované gf_ přestalo fungovat. Naštěstí se nám to podařilo zprovoznit.
Naše řešení je použít ExecStopPost
pro vyvolání skriptu upozornění e-mailem. Funguje to dobře, ale nyní se objevil nový problém:když se služba clickhouse normálně spustila, například při spuštění serveru, bylo odesláno e-mailové upozornění. I když to není velký problém, v ideálním případě jsme chtěli dostávat e-mailová upozornění pouze na haváriích. Dokázali jsme toho dosáhnout přidáním následujícího kódu do našeho e-mailového skriptu:
# Don't do anything if the service intentionally stopped successfully.
if [ $SERVICE_RESULT == "success" ]; then
exit
fi
... $SERVICE_RESULT
je proměnná prostředí dodávaná systémem systemd cílovému procesu ExecStopPost
. Zkontrolováním success
výsledek předpokládáme, že toto vyvolání přišlo z normálního spuštění nebo vypnutí a neděláme nic. Na jakoukoli jinou hodnotu, například signal
, skript bude pokračovat po odeslání e-mailu. Možné hodnoty této proměnné jsou uvedeny v dokumentaci.
Děkuji gf_ za počáteční řešení. Doufám, že lidé považují mou aktualizaci za užitečnou pro CentOS8. Několik dalších odkazů, které mi pomohly:
- https://superuser.com/questions/1360346/how-to-send-an-email-alert-when-a-linux-service-has-stoppped
- https://unix.stackexchange.com/questions/422933/confusing-systemd-behaviour-with-onfailure-and-restart
- https://unix.stackexchange.com/questions/197636/run-an-arbitrary-command-when-a-service-fails