$LOCK; if -6ren">
gpt4 book ai didi

linux - bash脚本flock()锁定并启动服务

转载 作者:太空宇宙 更新时间:2023-11-04 03:35:30 25 4
gpt4 key购买 nike

我想使用flock来确保在任何给定时间仅运行一次脚本实例。

脚本骨架如下所示:

ME=`basename "$0"`;
LOCK="/tmp/${ME}.LCK";
exec 8>$LOCK;



if flock -n -x 8; then
do things

if [ condition ]; then
/path/asterisk_restart.sh
fi
else
echo "$(date) script already running >> $log_file"

fi

现在脚本/path/asterisk_restart.sh做了很多事情,但最终asterisk被停止了,最后一个命令是service asterisk start

问题是这样的:由于文件句柄和锁在 fork()/exec() 之间共享,8 个文件句柄在 asterisk 进程中保持锁定,因此一旦执行 /path/asterisk_restart.sh ,脚本将不会再次运行(并且 asterisk 不会通过此脚本之外的其他方式停止/重新启动)

所以我的方法是在执行/path/asterisk_restart.sh之前启动子shell并关闭8个文件句柄。

看起来像这样:

    ME=`basename "$0"`;
LOCK="/tmp/${ME}.LCK";
exec 8>$LOCK;



if flock -n -x 8; then
do things

if [ condition ]; then
(
exec 8>&-
/path/asterisk_restart.sh
)
fi
else
echo "$(date) script already running >> $log_file"

fi

这是一个合理的方法吗?

最佳答案

为了防止脚本并行运行,我建议这样做。

if mkdir $LockDir; then
echo "Locking succeeded" >&2
# Your script here.
rm -f $LockDir
else
echo "Lock failed - exit" >&2
exit 1
fi

使用目录而不是文件更好,因为 mkdir 是原子操作,因此可以消除竞争条件。

也不要将 LockDir 放在/tmp 中。如果它被移除,锁就消失了。

上述实现的唯一问题是当 LockDir 被其他脚本删除时它不起作用。

关于linux - bash脚本flock()锁定并启动服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31723105/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com