gpt4 book ai didi

linux - 创建锁定文件时防止竞争条件

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:54:54 26 4
gpt4 key购买 nike

我的脚本不能同时运行多次。所以它创建一个锁定文件,并在退出前删除它。它会在开始工作之前检查锁定文件是否不存在。

一种非常常见的锁定方法是 something like this :

function setupLockFile() {
if (set -o noclobber; echo "lock" > "$lockfile") 2>/dev/null; then
trap "rm -f $lockfile; exit $?" INT TERM EXIT
else
echo "Script running... exiting!"
exit 1
fi
}

但是存在竞争条件 - 如果文件不存在,if 会创建该文件,并且脚本可能会在 trap 定义之前终止。那么锁文件就不会被删除。

那么做这件事的安全方法是什么?

最佳答案

这不是一场比赛——这是对失败的适应力。如果脚本在删除文件之前终止,则需要手动清理。

尝试自动执行此清理的通常方法是从任何现有文件中读取 PID,测试进程是否仍然存在,如果不存在则基本上忽略它的存在。不幸的是,如果没有一个原子比较和设置操作,正确地做起来并不容易,因为它在读取 PID 和其他试图忽略其存在的人之间引入了新的竞争。

查看 this question有关仅使用文件系统进行锁定的更多想法。

我的建议是要么将锁定文件存储在一个临时文件系统上(/var/run 通常是 tmpfs 以允许 pid 文件在重启时安全地消失)以便在重启后事情会自行修复,或者让脚本举手并要求人工干预。可靠地处理每个故障案例会增加复杂性,因此可能比向人寻求帮助更容易导致故障。

而且复杂性不仅仅存在于今天,还存在于代码的整个生命周期中。完成后它可能是正确的,但下一个人会打破它吗?

关于linux - 创建锁定文件时防止竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52274913/

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