确保在给定时间只运行一个shell脚本实例的快速而简单的方法是什么?
确保只有给定脚本的一个实例运行的最简单/最好的方法是什么 - 假设它是Linux上的Bash?
目前我正在做:
ps -C script.name.sh > /dev/null 2>&1 || ./script.name.sh
Run Code Online (Sandbox Code Playgroud)
但它有几个问题:
-C 仅检查进程名称的前14个字符当然,我可以编写自己的pidfile处理,但我觉得应该有一个简单的方法来实现它.
我的cron工作可能需要2分钟,或者可能需要5个小时才能完成.我需要确保始终执行此作业.
我的问题是:
如果我将它设置为每分钟执行一次,它会在上一个完成之后启动还是同时运行并弄乱数据库?
以下锁定机制用于防止cron作业并发运行:
#!/bin/bash
echo "Before critical section"
(
flock -e 200
echo "In critical section"
sleep 5
) 200>/tmp/blah.lockfile
echo "After critical section"
Run Code Online (Sandbox Code Playgroud)
当一起运行两个实例时,后者一直等到第一个完成,然后运行.这可能导致等待运行的脚本积压.
如何更改此脚本以便在flock无法获取锁定时终止脚本?我试过-n没有成功.
当必须通过文件系统同步程序(shell脚本)时,我发现了一个flock基于建议的解决方案(也应该在NFS上工作).从脚本(来自http://linux.die.net/man/1/flock)中使用的规范示例是:
(
flock -s 200
# ... commands executed under lock ...
) 200>/var/lock/mylockfile
Run Code Online (Sandbox Code Playgroud)
我不太明白为什么整个构造确保原子性.具体地讲,我想知道以何种顺序flock -s 200和200>/var/lock/mylockfile例如,当被执行bash执行这些代码行.这个订单是保证/确定性的吗?我理解它的方式,如果这个成语应该起作用,那一定是确定性的.但是由于子进程是在子进程中生成的,所以我不明白这两个进程是如何同步的.我只看到这两个命令之间的竞争条件.
如果有人能让我对此消失感到困惑并解释为什么这个结构可以用来安全地同步进程,我将不胜感激.
同时,如果有人知道,我会感兴趣的是选择一些任意文件描述符(例如200在示例中)是多么安全,特别是在具有许多客户端的大型NFS文件系统的上下文中.
我搜索了 Bash 如何创建互斥锁。我遇到了两种在 Bash 中创建互斥锁的不同方法。两者都是 stackoverflow 的答案,并且都有超过 100 个赞:一个答案使用mkdir,另一个答案使用flock.
在 bash 中创建互斥锁时,我应该使用flock还是mkdir?