
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/mailrc
funktioniert 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. mailx
Es ruft jedoch wahrscheinlich andere Binärdateien auf, die es im $PATH erwartet.
Es scheint, als ob mailx
eine --debug-level
Option unterstützt wird, die Sie festlegen können, trace7
um eine maximale Debug-Ausgabe zu erhalten.