GNU/Linux >> Znalost Linux >  >> Linux

Jak odeslat e-mail, pokud je služba systemd restartována?

Ř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:

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

Linux
  1. Jak spravovat služby Systemd pomocí Systemctl v systému Linux

  2. Jak používat příkaz Systemctl ke správě služeb Systemd

  3. Jak vytvořit službu Systemd v Linuxu

  1. Linux – jak získat méně Ttys s Systemd?

  2. Jak používat SSMTP k odeslání e-mailu z terminálu Linux

  3. Jak použít Systemd k restartování služby, když je vypnutá?

  1. Jak napsat spouštěcí skript pro Systemd?

  2. Jak zabalit službu Systemd?

  3. Jak odeslat e-mail s mým serverem CentOS?