【问题标题】:Has my bash script crashed?我的 bash 脚本崩溃了吗?
【发布时间】:2017-07-24 10:26:28
【问题描述】:

我有一个 bash shell 脚本,它应该:

1) 检查文件是否存在

2) 如果文件存在退出脚本,否则创建文件

3) 启动进程

4) 检查过程是否正确运行 - 并将结果发送到日志文件

5) 删除文件

6) 退出脚本

if [ -f $PROPERTIES_HC ]
 then               
 # lockfile/propertiesfile exists so exit the script
 log --------- lockfile exists so operation cancelled at `date` ---------

 exit 1
else
 # no lockfile/propertiesfile so continue

 # create the lockfile/propertiesfile

 input="./$PROPERTIES_VAR"
 while IFS= read -r line || [ -n "$line" ]; do
  eval "echo $line" >> $PROPERTIES_HC
 done < $PROPERTIES_VAR

 #Run Process

 RUN_MY_PROCESS --overridefile $PROPERTIES_HC >> $LOG_FILE

 #Check Process Ran Okay

 if [ "$?" = "0" ]; then
  echo "RAN WITHOUT ERROR" >> $LOG_FILE
 else
  echo "SOME ERROR!" >> $LOG_FILE
 fi

 # Remove the lockfile/propertiesfile

 rm -rf $PROPERTIES_HC
fi 

此脚本似乎运行良好,但最近我遇到了脚本的“RUN_MY_PROCESS”元素失败的情况,并且脚本似乎只是退出而将锁定文件保留在原位。

据我了解,除非我设置了 #!/bin/sh -e 之类的内容,否则无论出现错误,脚本都应该继续运行。我是否误解了 shell 脚本/shell 错误处理的工作原理(我是新手!),还是我的 shell 脚本自己崩溃了 - 因此它没有完成运行?

提前感谢您的帮助。

【问题讨论】:

  • 您的脚本因哪个错误而崩溃?
  • 此脚本作为每日 cron 作业运行。在日志文件中,我只能看到进程本身已失败(进程已创建将自己的信息发送到日志) - 但是它显然在此之后直接崩溃 - 即它永远不会到达脚本检查的地步进程是否运行正常。
  • 你能手动运行这个脚本吗?您也可以使用set -x 来执行此操作并获取每一行执行。
  • 我可以 - 但它现在运行良好...失败发生在星期六早上,因此脚本没有在星期天或今天早上运行 - 但我一删除它就运行良好锁定文件并手动重新运行。
  • 我想更清楚的问题是 - 查看当前的脚本,您是否希望锁定文件在所有情况下都被删除 - 或者是否有逻辑原因说明为什么它可能无法到达脚本的那部分,除了脚本崩溃。

标签: bash shell error-handling


【解决方案1】:

处理脚本中的错误(即导致脚本崩溃的错误)的正确方法是通过traps

你可以修改你的脚本如下:

if [ -f $PROPERTIES_HC ]
    #your regular script here
    #...

    #Run Process
    trap 'echo "SOME ERROR" >> $LOG_FILE && rm -rf $PROPERTIES_HC' ERR
    RUN_MY_PROCESS --overridefile $PROPERTIES_HC >> $LOG_FILE

    #rest of your script here
    #....

【讨论】:

    猜你喜欢
    • 2016-12-21
    • 1970-01-01
    • 2016-01-04
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多