首页 > 解决方案 > 让脚本以独占方式运行

问题描述

我试图让一个 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在锁定文件之前添加一个参数...)

标签: bashflock

解决方案


在我看来,flock 很复杂。
也许你可以试试这个方法。

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=""

推荐阅读