我正在尝试让bash脚本专门运行-如果脚本的另一个实例已经在运行,那么请等待另一个实例完成后再启动新的脚本。我发现了一些对create event delete_session
on schedule at current_timestamp + interval 1 day
on completion preserve
do begin
delete from session where date < DATE_SUB(NOW(), INTERVAL 7 DAYS);
end;
的引用,听起来像它应该满足我的要求,但似乎并没有达到我期望的方式。我有以下脚本:
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的两个实例都在并行运行... > 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
何时释放其锁?如何使其保持锁定,直到脚本完成?
(顺便说一句,如果我做flock
,那么它会抱怨flock -x -w 20 200
...,这似乎很奇怪,因为手册页似乎暗示我可以在前面添加一个flock: 20: fcntl: Bad file descriptor
参数锁文件...)
答案 0 :(得分:0)
flock seems to me very complicated.
Perhaps you can try this way.
cat script_unique.sh
while test -n "$run_sh"
do
sleep 2
done
export run_sh="run_sh"
sleep 2
echo "$run_sh"
sleep 4
echo "$0 $1"
run_sh=""
答案 1 :(得分:0)
好吧,我发现了我的错误-我使用的是老版本的flock,其界面与手册页中所述的界面不同。我更新了flock的新版本,并成功了。