6

下面是我在 bash 中执行的脚本。它工作正常。

fileexist=0
for i in $( ls /data/read-only/clv/daily/Finished-HADOOP_EXPORT_&processDate#.done); do
  mv /data/read-only/clv/daily/Finished-HADOOP_EXPORT_&processDate#.done /data/read-only/clv/daily/archieve-wip/
  fileexist=1
done

问题陈述:-

在我上面必须每天运行的 shell 脚本中cron job,我没有任何error/exception handling mechanism. 假设如果出现任何问题,那么我不知道发生了什么?

由于执行上述脚本后,有some other scripts that will be dependent on the data provided by above script,所以我总是收到其他依赖我的脚本数据的人的抱怨,说发生了错误。

那么get notified if anything wrong has happened我的脚本有什么办法吗?假设cluster is having some maintenance当时我正在运行我的脚本,那么它肯定会失败,那么如果我的上述脚本失败了,我可以得到通知,这样我就可以确定发生了错误。

希望我的问题足够清楚。

任何想法将不胜感激。

4

3 回答 3

11

您可以检查每个命令的退出状态,正如 freetx 回答的那样,但这是手动错误检查而不是异常处理。获得等效异常处理的标准方法sh是使用set -e. 这告诉sh一旦任何执行的命令失败(即以非零退出状态退出),就以非零状态退出。

如果它旨在使此类脚本中的某些命令(可能)失败,则可以使用构造COMMAND || true,这将强制该表达式的退出状态为零。例如:

#!/bin/sh

# if any of the following fails, the script fails
set -e
mkdir -p destdir/1/2
mv foo destdir/1/2
touch /done || true    # allowed to fail

另一种确保您在 cron 调用的脚本中出现问题时得到通知的方法是遵守 Unix 约定,即不打印任何内容,除非发生错误。成功的运行将在没有通知的情况下通过,不成功的运行将导致 cron 守护程序通过电子邮件通知您错误。请注意,本地邮件传递必须在您的系统上正确配置才能正常工作。

于 2012-09-09T06:30:28.987 回答
6

每个 unix 命令行实用程序通常在成功时返回 0,在失败时返回非零。因此,您可以使用 $? 模式来显示最后的返回值并相应地处理事情。

例如:

> ls
> file1 file2
> echo $?
> 0
> ls file.no.exist
> echo $?
> 1

因此,您可以将其用作基本错误检测,以查看是否出现问题。所以正常的方法是

some_command
if [ $? -gt 0 ]
then
handle_error here
fi
于 2012-09-09T00:27:39.643 回答
0

好吧,如果其他脚本在同一台机器上,那么您可以在其他脚本中为此脚本执行 pgrep,如果发现睡眠一段时间并稍后尝试其他脚本,重新检查过程就消失了。

如果脚本在另一台机器甚至本地,另一种方法是在远程机器上生成一个临时文件,可通过正在运行的 http 浏览器访问该文件,其他脚本可以检查状态,即运行或完成

您也可以将脚本包装在另一个寻找这些错误的脚本周围,如果找到它,如果没有按照正常方式将结果发送给任何人,则通过电子邮件发送给您

go=0;
function check_running() {

         running=`pgrep -f your_script.sh|wc -l `
    if [ $running -gt 1 ]; then
        echo "already running $0 -- instances found $running ";
      go=1;
}

check_running;
if [ $go -ge 1 ];then
      execute your other script
else
   sleep 120;
    check_running;
fi
于 2012-09-09T00:30:54.930 回答