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

相关内容