![更新](https://linux22.com/image/174300/%E6%9B%B4%E6%96%B0.png)
MTA
我的桌面上没有安装。
每当脚本出现问题时cronjob
,我都会在日志中看到以下内容:
CRON: (CRON) info (No MTA installed, discarding output)
一个应该运行的脚本cron
生成了一个错误,并cron
希望通过电子邮件向我发送该错误。
但我希望在我的日志中看到错误,即正常记录到syslog
,与上面的消息相同info
。
是否可以告诉cron
忘记MTA
并将所有内容(包括错误)记录到本地syslog
?
更新
@roaima 的解决方案非常适合我原来的问题。但我意识到我需要更复杂的语法cronjob
,其中stdout
fromcommand1
通过管道传输到 ,command2
并且stderr
(从两者?)通过管道传输到command3
。
这是一个具体的例子(简化):
0 * * * * mysqldump mydb | ifne xz > "/tmp/$(date +\%F).sql.xz" | logger -t mysqldump -p cron.err
在 abova 示例中,我需要将 stdout 从 发送mysqldump
到ifne xz
,并且仅当其中一个mysqldump
或ifne xz
生成错误时,我才需要将其通过管道传输到记录器。
dash
该语法需要在( /bin/sh
)中起作用
答案1
您可以使用记录器子系统。有两种变体,具体取决于您是否systemd
安装。
与
systemd
- 使用systemd-cat
echo This is a test with systemd-cat | systemd-cat -t mytest -p info
这会将消息写入日志记录器(请参阅 参考资料
journalctl
),并且还会写入遗留系统日志记录子系统,您可以在其中找到输出/var/log/syslog
,等等。journalctl -t mytest -- Logs begin at Thu 2020-05-21 07:41:00 UTC, end at Mon 2020-06-01 13:34:56 UTC. -- Jun 01 13:34:56 pi mytest[24236]: This is a test through systemd-cat
与
syslog
- 使用logger
echo This is a test with logger | logger -t mytest -p local0.info
这会通过 syslog 子系统(请参阅
rsyslog.conf
或类似)写入一条消息,您可以在其中找到输出/var/log/syslog
,等等。tail /var/log/syslog [...] Jun 1 13:34:56 pi mytest[24236]: This is a test through systemd-cat Jun 1 13:38:28 pi mytest: This is a test through logger
要使用这些日志记录选项之一,只需附加到您的作业,调整示例中的cron
标签名称 ( myscript
) 和优先级 ( )info
0 * * * * /path/to/script 2>&1 | systemd-cat -t myscript -p info
现在您已经提供了一个具体的示例,您想要的地方标准输出写入目标数据文件但您想要记录标准错误,你可以用这个
0 * * * * ( mysqldump mydb | ifne xz > "/tmp/$(date +\%F).sql.xz" ) 2>&1 | logger -t mysqldump -p cron.err