我们正在并行运行许多詹金斯项目。我们使用 python,并且选择使用 pyenv 管理虚拟环境。不幸的是,pyenv 有一个众所周知的竞争条件 https://github.com/yyuu/pyenv/issues/174。为了解决这个问题,我想在进程级别实现锁定。我想做的是:
lock some resource (a file?)
do my pyenv stuff
unlock the resource
我的脚本是用 bash 编写的。如何在 bash 中实现资源锁定/解锁?
因此,在 Unix 世界中,当你想要跨进程锁时,你的朋友是一个名为flock
。它是作为操作系统级别的原子操作实现的,对于此类事情非常有用。你可以阅读更多相关信息请点击此处 https://stackoverflow.com/questions/28227739/lock-a-file-in-bash-using-flock-and-lockfile。以下是如何使用它:
# Wait for lock on (fd 222) for 10 seconds
(flock -w 10 222 || exit 1
{
# Do the operations you want to here
}) 222>/path/to/lockfile
这里有几个技巧。首先,通常在使用输出重定向时,bash 在尝试集群之前会先打开一个文件。不过在这里,因为我们有()
bash 将首先启动一个子shell,其第一个命令是flock。 Flock 将尝试获取文件句柄 222 上的锁。然后 Flock 将锁定文件描述符。锁定文件描述符后,代码中{}
正在运行。运行之后,文件描述符 222 的内容被写入锁定文件(即,什么也没有),文件被关闭并且锁定被释放。这就像 C 中关闭文件会释放锁一样。当然,没有人比杰出的@CharlesDuffy(帽子提示@codeforester)更好地解释了到底发生了什么here https://stackoverflow.com/questions/28227739/lock-a-file-in-bash-using-flock-and-lockfile.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)