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

标签 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

问题陈述:-

在我必须使用cron 作业 每天运行的上述 shell 脚本中,我没有任何错误/异常处理机制。假设如果出现任何问题,那么我不知道发生了什么?

因为在上面的脚本执行之后,还有一些其他的脚本会依赖上面脚本提供的数据,所以我总是会收到依赖我脚本的其他人的提示发生错误的数据。

那么有什么方法可以让我在我的脚本发生任何错误时得到通知?假设如果 集群正在进行一些维护 并且那时我正在运行我的脚本,那么它肯定会失败,所以如果我的上述脚本失败了,我可以得到通知,这样我就可以肯定出了什么问题。

希望我的问题足够清楚。

任何想法将不胜感激。

最佳答案

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

关于linux - 如何处理 shell 脚本中的错误/异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12335356/

相关文章:

字符串连接在 Bash cygwin 中不起作用

C: fork() 子进程

linux - 如何在不生成临时文件的情况下在 shell 脚本中在生成的文件前面附加行数

linux - 如何模拟在 linux bash 中按下箭头键

linux - 如何像 QueryPerformanceCounter 那样计算 cpu 周期

c - 使用我自己的库运行 .c

c - printf 在共享内存中做了什么

bash - 命令替换 : backticks or dollar sign/paren enclosed?

c - 如何单独安装较新版本的gcc

regex - 使用 awk 或 sed 在文件中的特定行索引处插入一个字符