MailX 作为 Systemd 服务运行时不发送电子邮件

λ J*_*kas 2 email systemd mailx

我有一个 shell 脚本,它对我的​​ arch linux 系统上的一个文件夹运行 clamav 扫描,并应该通过电子邮件发送结果。这是代码:

\n\n
/usr/bin/clamscan -r -i /path/to/folder | /usr/bin/mailx -A gmail -s "Clam Scan Results $(/usr/bin/date +%F)" address@gmail.com\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果在 bash 命令行上运行,上面的一行代码可以正常工作,并且我确认在/etc/mailrc工作中配置的帐户并收到了电子邮件。但我希望它按计划运行,我设置了一个 systemd 服务单元来调用名为 ~/bin/virusscan.sh 的脚本,并设置了一个 systemd 计时器单元以在每晚凌晨 2 点触发它。管道之后的 mailx 部分始终在报告... email not sent

\n\n

SystemD 执行脚本的方式有显着差异吗?

\n\n

/usr/lib/systemd/system/virusscan.service

\n\n
[Unit]\nDescription=Daily virus scan\n\n[Service]\nType=simple\nExecStart=/home/username/bin/virusscan.sh\n\n[Install]\nWantedBy=multi-user.target\n
Run Code Online (Sandbox Code Playgroud)\n\n

/usr/lib/systemd/system/virusscan.timer

\n\n
[Unit]\nDescription=Execute virus scan daily at 2 AM\n\n[Timer]\nOnCalendar=*-*-* 02:00:00\nUnit=virusscan.service\n\n[Install]\nWantedBy=multi-user.target\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后我可以立即运行该服务来测试:

\n\n
sudo systemctl start virusscan \n
Run Code Online (Sandbox Code Playgroud)\n\n

服务运行时的状态如下:

\n\n
virusscan.service - Daily virus scan\n   Loaded: loaded (/usr/lib/systemd/system/virusscan.service; disabled; vendor preset: disabled)\n   Active: active (running) since Tue 2016-10-04 11:54:39 PDT; 11s ago\n Main PID: 29915 (virusscan.sh)\n    Tasks: 4 (limit: 4915)\n   CGroup: /system.slice/virusscan.service\n           \xe2\x94\x9c\xe2\x94\x8029915 /bin/sh /home/username/bin/virusscan.sh\n           \xe2\x94\x9c\xe2\x94\x8029920 /usr/bin/clamscan -r -i /path/to/folder/\n           \xe2\x94\x94\xe2\x94\x8029921 /usr/bin/mailx -A gmail -s Clam Scan Results 2016-10-04 address@gmail.com\n\nOct 04 11:54:39 hurricane systemd[1]: Started Daily virus scan.\n
Run Code Online (Sandbox Code Playgroud)\n\n

看起来 SystemD 将脚本中的一行代码分解为单独的进程,并且它还扩展了应该是消息主题行的字符串并删除了引号...这可能是问题所在,也许,我只需要正确地逃避它......然后当服务单元运行完成时,我总是在最后有以下行......

\n\n
Oct 04 11:55:01 hurricane virusscan.sh[29915]: ... message not sent\n
Run Code Online (Sandbox Code Playgroud)\n

Hen*_*sev 6

根据Arch Wiki,当脚本退出时,mailx 会分叉,systemd 会终止主进程。看起来像在 mailx 调用中添加 -v 可以防止它分叉,但让它与 systemd 一起工作的更正确方法是将 -Ssendwait 添加到 mailx 的参数中。