Mar*_*ter 2 cron syslog error-handling
MTA我的桌面上没有安装。
每当脚本出现问题时cronjob,我都会在日志中看到以下内容:
CRON: (CRON) info (No MTA installed, discarding output)
Run Code Online (Sandbox Code Playgroud)
一个应该运行的脚本cron生成了一个错误,并cron希望通过电子邮件向我发送该错误。
但我希望在我的日志中看到错误,即正常记录到syslog,与上面的消息相同info。
是否可以告诉cron忘记MTA并将所有内容(包括错误)记录到本地syslog?
@roaima 的解决方案非常适合我原来的问题。但我意识到我需要更复杂的语法cronjob,其中stdoutfrom 通过command1管道传输到command2,并且stderr(从两者?)通过管道传输到command3。
这是一个具体的例子(简化):
0 * * * * mysqldump mydb | ifne xz > "/tmp/$(date +\%F).sql.xz" | logger -t mysqldump -p cron.err
Run Code Online (Sandbox Code Playgroud)
在 abova 示例中,我需要将 stdout 从 发送mysqldump到ifne xz,并且仅当其中一个mysqldump或ifne xz生成错误时,我才需要将其通过管道传输到记录器。
dash该语法需要在( /bin/sh)中起作用
您可以使用记录器子系统。有两种变体,具体取决于您systemd是否安装。
与systemd- 使用systemd-cat
echo This is a test with systemd-cat | systemd-cat -t mytest -p info
Run Code Online (Sandbox Code Playgroud)
这会将消息写入日志记录器(请参阅 参考资料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
Run Code Online (Sandbox Code Playgroud)与syslog- 使用logger
echo This is a test with logger | logger -t mytest -p local0.info
Run Code Online (Sandbox Code Playgroud)
这会通过 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
Run Code Online (Sandbox Code Playgroud)要使用这些日志记录选项之一,只需附加到您的作业,调整示例中的cron标签名称 ( myscript) 和优先级 ( )info
0 * * * * /path/to/script 2>&1 | systemd-cat -t myscript -p info
Run Code Online (Sandbox Code Playgroud)
现在您已经提供了一个具体的示例,您希望将stdout写入目标数据文件,但想要记录stderr,您可以使用这个
0 * * * * ( mysqldump mydb | ifne xz > "/tmp/$(date +\%F).sql.xz" ) 2>&1 | logger -t mysqldump -p cron.err
Run Code Online (Sandbox Code Playgroud)