我有一个由Сron启动的过程,如下所示:
timeout 1h /app/longprocess.sh
现在我想通过电子邮件通知它,如果出现问题。想象一下:
notifyme maintainer@example.org timeout 1h /app/longprocess.sh
其中notifyme
是一个假设的命令,如果命令以非零状态退出,它将使用命令的输出向maintainer@example.org
发送电子邮件。有这样的事吗?
答案 0 :(得分:2)
不,但是(未经测试)
notifyme() {
local recipient=$1
shift
output=$( "$@" 2>&1 )
rc=$?
echo "$output"
if [[ $rc -ne 0 ]]; then
mailx -s "Non-zero exit status ($rc) for command: $*" "$recipient" <<< "$output"
fi
}
答案 1 :(得分:1)
使用逻辑OR
运算符||
。当||
被添加到命令中时,列出之后>>只有在列出之前它返回非零状态(即,如果它出错了。)例如,使用您提供的代码:
timeout 1h /app/longprocess.sh || mail -s "job failed" maintainer@example.org
在上述命令中,如果mail -s "job failed" maintainer@example.org
不成功,timeout 1h /app/longprocess.sh
将仅执行。
答案 2 :(得分:1)
我建议使用||
并始终ping外部监控服务,而不是使用另一个答案中建议的&&
运算符。如果缺少ping,监控服务会提醒您。如果您的cronjob因任何原因没有启动,这也有助于获得警报。一个这样的监视器是this answer。
你的cronjob看起来像
timeout 1h /app/longprocess.sh && curl somemonitor.com/longprocess