我希望 cron 只在 stderr 输出上发送电子邮件,但当它这样做时,它应该包括所有 stdout 和 stderr
这与仅在 stderr 上发送电子邮件的常见问题不同(即将 stdout 重定向到 /dev/null)。在这种情况下,cron 只通过电子邮件发送 stderr,但我想查看上下文的所有内容。
我正在运行 Rocky 9,并使用 cronie 作为 cron 守护进程。
我希望 cron 只在 stderr 输出上发送电子邮件,但当它这样做时,它应该包括所有 stdout 和 stderr
这与仅在 stderr 上发送电子邮件的常见问题不同(即将 stdout 重定向到 /dev/null)。在这种情况下,cron 只通过电子邮件发送 stderr,但我想查看上下文的所有内容。
我正在运行 Rocky 9,并使用 cronie 作为 cron 守护进程。
如果命令以非零状态代码退出,您可以尝试:
在哪里:
bash -c ''
允许在 cronjob 上使用多个命令;您也可以使用脚本。command
是要执行的命令的路径2>&1
将 stderr 重定向到 stdout> /tmp/err
将标准输出(现在是两个流)保存到文件(路径/tmp/err
)||
仅当第一个命令失败且状态代码非零时才运行第二个命令mail -A /tmp/err
将文件作为附件发送mail [email protected] < /tmp/err
会将其作为消息正文发送您可以使用以下方法来增强此功能,例如,在同时运行且文件末尾缺少某些内容的
mktemp
情况下,为每个日志使用不同的路径。sleep
我决定编写一个脚本来近似解决仅在 stderr 输出上发送电子邮件的问题。
关键是将 stdout/stderr 存储到文件中,直到检测到 stderr,然后输出组合文件。
只要 tail 能够足够快地迭代其文件,组合文件就可以大致说保留了 stdout/stderr 顺序。如果没有缓冲并且命令需要超过一两秒,并且 stdout/stderr 输出之间存在一些延迟,则此方法可以近似有序的 stdout/stderr 输出。
我将此脚本称为 cron-wrapper.sh。它的目的是接受命令和参数并运行它们。
它旨在从 crontab 中调用,如下所示:
30 * * * * root sh cron-wrapper.sh sh cron-job.sh >/dev/null
请注意,当在 stderr 上输出所有内容时,“所有内容”都会输出到 stderr 而不是 stdout,以满足我的要求,即 cron 通过电子邮件发送 stderr 输出上的所有内容
脚本: