使用退出代码监控 Cron 作业

使用退出代码监控 Cron 作业

我想使用 shell 脚本监控 cron 作业。但如果我使用变量包含最后一个命令的退出代码,我总是有“0”。我认为这是因为我在 cron 作业之后运行此脚本,并且“退出代码”取值为“0”(启动脚本) 如何忽略脚本的启动并使用上一个 cron 作业的“退出代码”变量?

$ ls foo ;回声$?
ls: 无法访问 foo: 没有这样的文件或目录
2
$ ls foo
ls: 无法访问 foo: 没有这样的文件或目录
$ sh 测试.sh
0

我的测试.sh:

#!/bin/bash

通知() {
退出代码=$?
回显${EXIT_CODE}
}
通知

答案1

您可以将退出代码作为参数传递给脚本:

ls -l /tmp/filethatdoesnotex.ist
/usr/local/bin/test.sh $?

与测试.sh:

RESULT=$1
if [ $RESULT -gt 0 ]
then
   echo "something bad happened and ended with result $RESULT" >&2
else
   echo "everything is fine, sleep on"
fi

答案2

命令的退出状态不是全局存储在系统中的。它由执行命令的 shell 保存在本地。一旦 shell 执行另一个命令,之前的退出状态就会丢失。

shell 会自行退出并显示最后一个命令的状态;因此,如果 shell 脚本中的最后一个命令失败,则 shell 的退出状态也不为零。

我不知道您是如何认为 cron 作业导致的退出状态可以在其他随机 shell 会话或脚本中确定的;如果有 20 个作业并行运行,您要找出哪个退出状态属于哪个作业吗?做不到。

您需要修复 cron 作业以将其退出状态保存到某个状态文件中;然后您可以稍后读取该状态文件。

相关内容