【发布时间】:2019-06-13 00:00:33
【问题描述】:
我正在尝试让一个 bash 脚本以独占方式运行——如果脚本的另一个实例已经在运行,那么在启动新实例之前等待另一个实例完成。我发现了一些对flock 的引用,听起来它应该可以满足我的需要,但它似乎并没有按我期望的方式工作。我有以下脚本:
#!/bin/bash
inst=$1
lock=/nobackup/julvr/locks/_tst.lk
exec 200>$lock
flock -x -w30 200 || { echo "$inst: failed flock" && exit 1; }
echo "$inst:got lock"
for i in {1..2}; do
echo "$inst: $i"
sleep 1
done
echo "$inst:done script";
然后我跑
> flocktest.sh test1 & flocktest.sh test2
[1] 25213
test1:got lock
test1: 1
test2:got lock
test2: 1
test1: 2
test2: 2
test1:done script
test2:done script
[1]+ Done flocktest.sh test1
flocktest 的两个实例似乎都在并行运行...flock 什么时候释放它的锁?如何让它保持锁定直到脚本完成?
(顺便说一句,如果我这样做flock -x -w 20 200,那么它会抱怨flock: 20: fcntl: Bad file descriptor...,这看起来很奇怪,因为手册页似乎暗示我可以在锁定文件之前添加一个--w timeout 参数...)
【问题讨论】:
-
为我工作。您在哪个操作系统上运行它,您的锁定文件在什么 fs 上?
-
文件在Linux机器上(2.6.32-696.18.7.el6.x86_64),文件在挂载目录中。
-
好的,知道了。显然有人重新映射了 PATH,它正在抓取一个非常旧版本的羊群,这不像我期望的那样工作......