Linux中是否有一个程序可以执行命令并在失败时发送电子邮件?

时间:2015-11-03 21:03:42

标签: linux bash cron

我有一个由Сron启动的过程,如下所示:

timeout 1h /app/longprocess.sh

现在我想通过电子邮件通知它,如果出现问题。想象一下:

notifyme maintainer@example.org timeout 1h /app/longprocess.sh

其中notifyme是一个假设的命令,如果命令以非零状态退出,它将使用命令的输出向maintainer@example.org发送电子邮件。有这样的事吗?

3 个答案:

答案 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