cron:将错误发送到系统日志,而不是 MTA

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 从 发送mysqldumpifne xz,并且仅当其中一个mysqldumpifne xz生成错误时,我才需要将其通过管道传输到记录器。

dash该语法需要在( /bin/sh)中起作用

roa*_*ima 5

您可以使用记录器子系统。有两种变体,具体取决于您systemd是否安装。

  1. 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)
  2. 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)