
我有一個 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
答案3
在為您處理日誌記錄和良好的狀態報告方面,使用 systemd 計時器與 cron 相比有一些好處。
與 cron 相比,systemd 預設確實有更嚴格的 $PATH 環境設定。
在您的範例中,您僅指定了完整路徑,因此不能立即清楚這就是問題所在。但是,mailx
可能會呼叫它希望在 $PATH 中找到的其他一些二進位。
它看起來mailx
支援一個--debug-level
選項,您可以設定該選項trace7
以獲得最大偵錯輸出。