【问题标题】:getting scripts to run exclusively让脚本以独占方式运行
【发布时间】: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,它正在抓取一个非常旧版本的羊群,这不像我期望的那样工作......

标签: bash flock


【解决方案1】:

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

【讨论】:

  • 谢谢,但是羊群确实更干净。我的问题是我使用的是旧版本的羊群,其界面与手册页描述的不同。我正在关闭这个问题。
【解决方案2】:

好的,我发现了我的错误——我使用的是一个非常旧版本的flock,它的界面与手册页中描述的界面不同。我更新到新版本的flock,它工作了。

【讨论】:

    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    • 2014-04-07
    • 2011-08-04
    • 2011-02-20
    相关资源
    最近更新 更多