我有一个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脚本没有经验,所以我去学习。
答案 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
可以在此处找到正确信号处理的一个很好的解释: