如何处理在shell脚本错误/异常?(How to handle error/exception i

2019-09-22 06:08发布

下面是我的,我在我的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和当时我正在我的剧本,所以肯定会被失败是肯定的,那么,我可以得到通知,如果我的上述脚本失败,让我一定会有毛病发生。

希望我的问题是非常明显的。

任何想法将不胜感激。

Answer 1:

您可以检查每个命令的退出状态,freetx回答,但这是人工错误检查,而不是异常处理。 获得例外处理相当于标准方法sh是先从剧本set -e 。 这告诉sh只要任何执行命令失败(即具有非零状态退出)与非零状态退出。

如果打算对一些命令在这样一个脚本(可能)会失败,你可以使用结构COMMAND || true 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守护程序通过电子邮件通知您错误的。 需要注意的是本地邮件投递必须在系统上正确配置这个工作。



Answer 2:

它为每一个UNIX命令行实用程序习惯在成功和失败非零返回0。 因此,你可以使用$? 模式显示最后一个返回值,并相应地处理事情。

例如:

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

因此,你可以使用这个作为基本的错误检测,看看是否出现错误。 因此,正常的做法是

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


Answer 3:

那么,如果其他脚本是在同一台机器上,那么你可以为这个脚本如果发现睡一会,并尝试其他脚本日后复查过程不见了,在其他脚本p纤ep。

如果脚本是另一台机器上,甚至当地的另一种方法是产生访问远程计算机上的临时文件通过运行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


文章来源: How to handle error/exception in shell script?