更新

更新

MTA我的桌面上没有安装。

每当脚本出现问题时cronjob,我都会在日志中看到以下内容:

CRON:  (CRON) info (No MTA installed, discarding output)

一个应该运行的脚本cron生成了一个错误,并cron希望通过电子邮件向我发送该错误。

但我希望在我的日志中看到错误,即正常记录到syslog,与上面的消息相同info

是否可以告诉cron忘记MTA并将所有内容(包括错误)记录到本地syslog

更新

@roaima 的解决方案非常适合我原来的问题。但我意识到我需要更复杂的语法cronjob,其中stdoutfromcommand1通过管道传输到 ,command2并且stderr(从两者?)通过管道传输到command3

这是一个具体的例子(简化):

0 * * * * mysqldump mydb | ifne xz > "/tmp/$(date +\%F).sql.xz" | logger -t mysqldump -p cron.err

在 abova 示例中,我需要将 stdout 从 发送mysqldumpifne xz,并且仅当其中一个mysqldumpifne xz生成错误时,我才需要将其通过管道传输到记录器。

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

答案1

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

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

相关内容