下面是我在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>
希望我的问题足够明确。
任何想法都将受到赞赏。
答案 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