如何处理shell脚本中的错误/异常?

时间:2012-09-08 23:38:25

标签: linux bash shell unix

下面是我在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并且当时我正在运行我的脚本,那么肯定会失败肯定,所以如果我的上述脚本失败,我可以得到通知,这样我就可以确定发生了错误。< / p>

希望我的问题足够明确。

任何想法都将受到赞赏。

3 个答案:

答案 0 :(得分: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调用的脚本中出现问题时通知您的另一种方法是遵守printing nothing unless an error ocurred的Unix约定。成功的运行将在没有通知的情况下通过,并且不成功的运行将导致cron守护程序通过电子邮件通知您错误。请注意,必须在系统上正确配置本地邮件传递才能使其正常工作。

答案 1 :(得分:5)

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

例如:

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

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

some_command
if [ $? -gt 0 ]
then
handle_error here
fi

答案 2 :(得分: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