在Unix脚本中使用陷阱
我编写了一个脚本,将文件从一台服务器传输到另一台服务器 首先,我在一台服务器上创建所有压缩文件的tar,然后将tar传输到另一台服务器 成功传输后,我正在对两台服务器上的文件进行卸载 我需要知道一件事,如果tar文件损坏或传输失败,如何使用Unix陷阱功能来处理可重启性和错误 如果存在任何错误,我需要将执行恢复到初始状态 下面提到的是我脚本中的一小段代码在Unix脚本中使用陷阱,unix,Unix,我编写了一个脚本,将文件从一台服务器传输到另一台服务器 首先,我在一台服务器上创建所有压缩文件的tar,然后将tar传输到另一台服务器 成功传输后,我正在对两台服务器上的文件进行卸载 我需要知道一件事,如果tar文件损坏或传输失败,如何使用Unix陷阱功能来处理可重启性和错误 如果存在任何错误,我需要将执行恢复到初始状态 下面提到的是我脚本中的一小段代码 tar -cvf files_to_send.tar *.txt -C ${1} RC=$? if
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非常感谢您的解决方案。我的另一个问题是,如果我将命令返回代码的值保存在变量中,是否存在任何问题。。因为我已经完成了脚本,我需要尽快交付,所以我不想在这一点上做任何大的改变。请让我知道,如果我将使用返回代码来处理它,我是否会错过任何错误/可重启性场景?保持返回代码和您一样没有问题,只是没有那么优雅,也不简洁