下面是我在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守护程序通知您错误通过电子邮件.请注意,必须在系统上正确配置本地邮件传递才能使其正常工作.