linux – 如何在shell脚本中处理错误/异常?

下面是我在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运行,我没有任何错误/异常处理机制.假设如果出现任何问题,我不知道发生了什么?

在执行上述脚本之后,还有一些其他脚本将依赖于上述脚本提供的数据,因此我总是得到其他人的抱怨,这些人依赖于我的脚本数据发生了错误.

如果我的脚本中发生了任何错误,我有什么方法可以得到通知吗?假设集群正在进行一些维护,那时我正在运行我的脚本,所以肯定会失败肯定,所以如果上面的脚本失败,我可以得到通知,这样我就可以确定发生了什么错误.

希望我的问题很清楚.

任何想法将不胜感激.

解决方法

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

如果打算让这样的脚本中的某些命令(可能)失败,可以使用构造命令|| 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约定printing nothing unless an error ocurred.成功运行将在不事先通知的情况下通过,并且不成功运行将导致cron守护程序通知错误通过电子邮件.请注意,必须在系统上正确配置本地邮件传递才能使其正常工作.

相关文章

文件查找(find) 1 find 简单的说,就是实时查找指定的内容或条件。特点:最新、最快、最准确。 用法:...
非交互式添加分区 方法一 添加/deb/sdb 下的分区,其实位置为1到1000M,第二个分区位置为1001至3000M,...
编译安装httpd 1 去官网下载源码包 为避免非法软件,一定要去官网下载http://www.apache.org httpd-2.4...
gdisk用法 gdisk - InteractiveGUIDpartitiontable (GPT) manipulator GPTfdisk (akagdisk) isatext-mo...
1 一定用快捷键 这里简单的说下几个常用的快捷按键。 1.1 移动光标快捷键 Crtl + a 光标回到命令行...
bash shell中测试命令 test命令提供了if-than语句中测试不同条件的途径。如果test命令中列出的条件成立...