bash - 让脚本以独占方式运行
问题描述
我试图让一个 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
在锁定文件之前添加一个参数...)
解决方案
在我看来,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=""
推荐阅读
- c# - 将场景大纲“示例”表解析为对象
- python - Jupyter notebook:让用户输入绘图
- reactjs - 如何使用将通过 onClick() 函数作为 URL 参数传入的参数创建函数?
- c++ - ofstream 没有在 Linux 的 Windows 子系统中生成新行
- jquery - 当我在 IIS 上发布时响应 False
- css - 如何在元素中定位第一个孩子
- javascript - 有没有办法在 JavaScript 中遍历一个可能自包含的对象?
- python - 基于时间范围,如何在python中从应用程序日志中grep整个线程日志
- c# - 从包含视图的测试中运行控制器操作
- javascript - 如何将 JSON 日期转换为日历格式?