MailX sendet keine E-Mails, wenn es als Systemd-Dienst ausgeführt wird

MailX sendet keine E-Mails, wenn es als Systemd-Dienst ausgeführt wird

Ich habe ein Shell-Skript, das einen Clamav-Scan für einen Ordner auf meinem Arch-Linux-System ausführt und die Ergebnisse per E-Mail verschicken soll. Hier ist der Code:

/usr/bin/clamscan -r -i /path/to/folder | /usr/bin/mailx -A gmail -s "Clam Scan Results $(/usr/bin/date +%F)" [email protected]

Der obige Einzeiler funktioniert einwandfrei, wenn er in der Bash-Befehlszeile ausgeführt wird, und ich habe bestätigt, dass das konfigurierte Konto /etc/mailrcfunktioniert und E-Mails empfangen werden. Aber ich möchte, dass es nach einem Zeitplan ausgeführt wird, und habe eine systemd-Service-Einheit eingerichtet, die ein Skript namens ~/bin/virusscan.sh aufruft, sowie eine systemd-Timer-Einheit, die es jede Nacht um 2 Uhr auslöst. Der Mailx-Teil nach der Pipe meldet immer... email not sent

Gibt es einen signifikanten Unterschied in der Art und Weise, wie SystemD das Skript ausführt?

/usr/lib/systemd/system/virusscan.service

[Unit]
Description=Daily virus scan

[Service]
Type=simple
ExecStart=/home/username/bin/virusscan.sh

[Install]
WantedBy=multi-user.target

/usr/lib/systemd/system/virusscan.timer

[Unit]
Description=Execute virus scan daily at 2 AM

[Timer]
OnCalendar=*-*-* 02:00:00
Unit=virusscan.service

[Install]
WantedBy=multi-user.target

Dann kann ich den Dienst zum Testen sofort ausführen mit:

sudo systemctl start virusscan 

Der Status des Dienstes während der Ausführung ist der folgende:

virusscan.service - Daily virus scan
   Loaded: loaded (/usr/lib/systemd/system/virusscan.service; disabled; vendor preset: disabled)
   Active: active (running) since Tue 2016-10-04 11:54:39 PDT; 11s ago
 Main PID: 29915 (virusscan.sh)
    Tasks: 4 (limit: 4915)
   CGroup: /system.slice/virusscan.service
           ├─29915 /bin/sh /home/username/bin/virusscan.sh
           ├─29920 /usr/bin/clamscan -r -i /path/to/folder/
           └─29921 /usr/bin/mailx -A gmail -s Clam Scan Results 2016-10-04 [email protected]

Oct 04 11:54:39 hurricane systemd[1]: Started Daily virus scan.

Es sieht so aus, als würde SystemD den Einzeiler im Skript in separate Prozesse aufteilen und außerdem die Zeichenfolge erweitern, die die Betreffzeile der Nachricht darstellen soll, und die Anführungszeichen entfernen ... Das könnte möglicherweise das Problem sein, und ich muss es nur richtig maskieren ... Wenn die Serviceeinheit dann fertig ausgeführt wird, habe ich am Ende immer die folgende Zeile ...

Oct 04 11:55:01 hurricane virusscan.sh[29915]: ... message not sent

Antwort1

EntsprechendArch Wikimailx verzweigt sich und systemd beendet den Hauptprozess, wenn das Skript beendet wird. Es sieht so aus, als ob das Hinzufügen von -v zum mailx-Aufruf das Verzweigen verhindert, aber eine korrektere Möglichkeit, es mit systemd zum Laufen zu bringen, besteht darin, -Ssendwait zu den Argumenten von mailx hinzuzufügen.

Antwort2

Systemd unterstützt OptionKill-Modus, die standardmäßig auf Kontrollgruppe gesetzt ist. Wenn auf

KillMode=process

Der gegabelte Prozess wird nicht beendet, wenn das Skript fertig ist.

Antwort3

Die Verwendung von Systemd-Timern bietet gegenüber Cron einige Vorteile, da die Protokollierung für Sie übernommen wird und schöne Statusberichte erstellt werden.

systemd hat im Vergleich zu cron standardmäßig eine restriktivere $PATH-Umgebungseinstellung.

In Ihren Beispielen haben Sie nur vollständige Pfade angegeben, daher ist nicht sofort klar, dass dies das Problem ist. mailxEs ruft jedoch wahrscheinlich andere Binärdateien auf, die es im $PATH erwartet.

Es scheint, als ob mailxeine --debug-levelOption unterstützt wird, die Sie festlegen können, trace7um eine maximale Debug-Ausgabe zu erhalten.

verwandte Informationen