繁体   English   中英

Bash脚本退出清理

[英]Bash script exit cleanup

我有一个bash脚本,可以转发到其他shell脚本和python脚本的混合。 如果这些脚本中的任何一个失败或用户取消脚本(CTRL + C),我想在所有情况下执行一些清理。

许多用户可以在相同的OS用户下SSH到Linux机器箱并启动构建。 这是我们的构建服务器。 该脚本需要编写一个“build.lock”文件或其他东西,无论何时脚本退出都会被清除(错误,用户退出等)。 如果脚本在第一个脚本执行完之前再次运行,它应该检查“build.lock”文件并拒绝继续。

我假设这是防止脚本并行执行的最佳方法。 我们在Ubuntu上使用Bash。 以下是脚本本身:

#!/bin/bash -e
pushd build-server-scripts > /dev/null
./build.sh "$@"
popd > /dev/null

我的想法是解决这个问题的好方法吗? 如果是这样,实施它的方法是什么? 如果没有,每个人都会推荐其他什么想法? 我对Bash脚本没有经验,所以我随便学习。

如果我正确理解您的问题,您可能需要查看bash的trap您可以定义在脚本退出时调用的陷阱函数

# Set up a cleanup function to be triggered upon script exit
__cleanup ()
{
    [[ -f "build.lock" ]] && rm "build.lock"
}

trap __cleanup EXIT

使用陷阱时,不要忘记将接收到的信号传播到调用进程:

__cleanup()
{
    SIGNAL=$1

    [[ -f "build.lock" ]] && rm "build.lock"

    # when this function was called due to receiving a signal
    # disable the previously set trap and kill yourself with
    # the received signal
    if [ -n "$SIGNAL" ]
    then
        trap $SIGNAL
        kill -${SIGNAL} $$
    fi
}

在这种情况下,将像这样调用trap:

trap '__cleanup 1' HUP
trap '__cleanup 2' INT
trap '__cleanup 3' QUIT
trap '__cleanup 13' PIPE
trap '__cleanup 15' TERM

可在此处找到正确信号处理的一个很好的解释:

正确处理SIGINT / SIGQUIT

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM