我有一个 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
以获得最大调试输出。