Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Unix脚本中使用陷阱_Unix - Fatal编程技术网

在Unix脚本中使用陷阱

在Unix脚本中使用陷阱,unix,Unix,我编写了一个脚本,将文件从一台服务器传输到另一台服务器 首先,我在一台服务器上创建所有压缩文件的tar,然后将tar传输到另一台服务器 成功传输后,我正在对两台服务器上的文件进行卸载 我需要知道一件事,如果tar文件损坏或传输失败,如何使用Unix陷阱功能来处理可重启性和错误 如果存在任何错误,我需要将执行恢复到初始状态 下面提到的是我脚本中的一小段代码 tar -cvf files_to_send.tar *.txt -C ${1} RC=$? if

我编写了一个脚本,将文件从一台服务器传输到另一台服务器

首先,我在一台服务器上创建所有压缩文件的tar,然后将tar传输到另一台服务器

成功传输后,我正在对两台服务器上的文件进行卸载

我需要知道一件事,如果tar文件损坏或传输失败,如何使用Unix陷阱功能来处理可重启性和错误

如果存在任何错误,我需要将执行恢复到初始状态

下面提到的是我脚本中的一小段代码

tar -cvf files_to_send.tar *.txt -C ${1} 
          RC=$?
          if [ ${RC} -ne 0 ]; then
             echo "Unable to Create Tar files of received files" >> ${LOG_FILE}
             rm -f *_end >> ${LOG_FILE}
             return 1
          fi

          cd ${1}
          gzip files_to_send.tar
          RC=$?
          if [ ${RC} -ne 0 ]; then
             echo "Unable to Create Zip of tar files" >> ${LOG_FILE}
             echo "Deleting End Files" >> ${LOG_FILE}
             rm -f *_end >> ${LOG_FILE}
             echo "Deleting tar file" >> ${LOG_FILE}
             rm -f ${1}/files_to_send.tar >> ${LOG_FILE}
             return 1
          fi


          cd ${1}
          chmod 775 files_to_send.tar.gz  >> ${LOG_FILE}
          RC=$?

          if [ ${RC} -ne 0 ]; then
             echo "Unable to change permissions of tar and end files" > ${LOG_FILE}
             echo "Deleting End Files" >> ${LOG_FILE}
             rm -f *_end >> ${LOG_FILE}
             echo "Deleting Zipped tar file" >> ${LOG_FILE}
             rm -f ${SOURCE_DIR}/files_to_send.tar.gz >> ${LOG_FILE}
             return 1

您可以这样做:

trap 'do_something' ERR # start special error handling
tar ... # if the command fails, do_something will be executed
trap - ERR # stopping special error handling
做某事
可以是函数、命令或脚本

但是,如果正确处理错误案例,您甚至不需要
陷阱。我使用布尔逻辑编写了一个脚本版本,无需将返回代码存储在变量中,请参见:

if tar -cvf files_to_send.tar *.txt -C ${1}; then
    echo "Unable to Create Tar files of received files" >> ${LOG_FILE}
    rm -f *_end >> ${LOG_FILE}
    return 1
fi

cd ${1}

if gzip files_to_send.tar; then
    echo "Unable to Create Zip of tar files" >> ${LOG_FILE}
    echo "Deleting End Files" >> ${LOG_FILE}
    rm -f *_end >> ${LOG_FILE}
    echo "Deleting tar file" >> ${LOG_FILE}
    rm -f ${1}/files_to_send.tar >> ${LOG_FILE}
    return 1
fi


cd ${1}
if chmod 775 files_to_send.tar.gz >> ${LOG_FILE}; then
    echo "Unable to change permissions of tar and end files" > ${LOG_FILE}
    echo "Deleting End Files" >> ${LOG_FILE}
    rm -f *_end >> ${LOG_FILE}
    echo "Deleting Zipped tar file" >> ${LOG_FILE}
    rm -f ${SOURCE_DIR}/files_to_send.tar.gz >> ${LOG_FILE}
    return 1
fi  

如果我在脚本中使用返回码,我还需要添加陷阱吗?不,可以同时使用这两种逻辑或布尔逻辑,如:
if tar。。。;然后回音ok;否则,埃科诺克;fi
谢谢您的回复。这就是我使用布尔函数的方式,如下所述。mv${SOURCE_DIR}/files_to_send.tar.gz${MOVE_DIR}>${LOG_FILE}RC=$?如果[$RC-ne 0];然后回显“无法将文件移动到临时目录”>${LOG_FILE}rm-f${SOURCE_DIR}/files_到_send.tar.gz;rm-f${SOURCE\u DIR}/*\u end>${LOG\u FILE}exit 1非常感谢您的解决方案。我的另一个问题是,如果我将命令返回代码的值保存在变量中,是否存在任何问题。。因为我已经完成了脚本,我需要尽快交付,所以我不想在这一点上做任何大的改变。请让我知道,如果我将使用返回代码来处理它,我是否会错过任何错误/可重启性场景?保持返回代码和您一样没有问题,只是没有那么优雅,也不简洁