Bash脚本退出清理

时间:2014-06-10 22:14:25

标签: linux bash

我有一个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脚本没有经验,所以我去学习。

2 个答案:

答案 0 :(得分:4)

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

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

trap __cleanup EXIT

答案 1 :(得分:1)

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

__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 '__cleanup 1' HUP
trap '__cleanup 2' INT
trap '__cleanup 3' QUIT
trap '__cleanup 13' PIPE
trap '__cleanup 15' TERM

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

Proper handling of SIGINT/SIGQUIT