MailX 作為 Systemd 服務執行時間不傳送電子郵件

MailX 作為 Systemd 服務執行時間不傳送電子郵件

我有一個 shell 腳本,它對我的 arch linux 系統上的一個資料夾執行 clamav 掃描,並且應該透過電子郵件發送結果。這是代碼:

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

如果在 bash 命令列上運行,上面的一行程式碼可以正常工作,並且我確認在/etc/mailrc工作中配置的帳戶並收到了電子郵件。但我希望它按計劃運行,我設定了一個 systemd 服務單元來呼叫名為 ~/bin/virusscan.sh 的腳本,並設定了一個 systemd 計時器單元以在每晚凌晨 2 點觸發它。管道之後的 mailx 部分始終在報告... email not sent

SystemD 執行腳本的方式有顯著差異嗎?

/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

然後我可以立即運行該服務來測試:

sudo systemctl start virusscan 

服務運行時的狀態如下:

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.

看起來 SystemD 將腳本中的一行程式碼分解為單獨的進程,並且它還擴展了應該是訊息主題行的字串並刪除了引號...這可能是問題所在,也許,我只需要正確地逃避它....然後當服務單元運行完成時,我總是在最後有以下行...

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

答案1

根據拱門維基mailx forks 和 systemd 在腳本退出時終止主程序。看起來像在 mailx 呼叫中添加 -v 可以防止它分叉,但讓它與 systemd 一起工作的更正確方法是將 -Ssendwait 添加到 mailx 的參數中。

答案2

Systemd 支援選項殺戮模式,預設為對照組。如果設定為

KillMode=process

腳本完成後它不會終止分叉進程。

答案3

在為您處理日誌記錄和良好的狀態報告方面,使用 systemd 計時器與 cron 相比有一些好處。

與 cron 相比,systemd 預設確實有更嚴格的 $PATH 環境設定。

在您的範例中,您僅指定了完整路徑,因此不能立即清楚這就是問題所在。但是,mailx可能會呼叫它希望在 $PATH 中找到的其他一些二進位。

它看起來mailx支援一個--debug-level選項,您可以設定該選項trace7以獲得最大偵錯輸出。

相關內容