chronic
,它是 的一部分moreutils
,是用于选择性地仅通过电子邮件通知 cron 任务的绝佳工具:
chronic runs a command, and arranges for its standard out and standard
error to only be displayed if the command fails (exits nonzero or
crashes). If the command succeeds, any extraneous output will be
hidden.
我想使用chronic,但另外(总是)将完整的stdout和stderr附加到日志文件。
我怎样才能实现这个目标?(重定向/命名管道?)
答案1
如果您没有同时对同一日志运行命令,您可以做一些简单的事情,只需记住日志文件的当前结尾在哪里,然后在失败时从该点转储它。以下是使用函数而不是脚本的测试:
#!/bin/bash
chronicish(){
let len=1+$(stat -c %s log)
if ! "$@" >>log 2>&1
then tail -c +"$len" log
return 1
fi
}
cmd()( echo stdout; echo stderr msg >&2; exit $1; )
chronicish cmd 0
chronicish cmd 1
测试命令是一个函数cmd
,它接受一个数字作为退出,并将一些文本写入 stdout。该函数chronicish
用于运行命令,并在失败时跟踪日志文件。
为了简单起见,我将 stdout 和 stderr 合并为一个日志,但显然可以对两个单独的日志文件执行相同的技术。