使脚本专门运行

时间:2019-01-18 17:24:23

标签: bash flock

我正在尝试让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参数锁文件...)

2 个答案:

答案 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的新版本,并成功了。