可能重复:
Quick-and-dirty way to ensure only one instance of a shell script is running at a time
我已经设置了一个cronjob来正确备份我的文件夹,我很自豪。但是,通过查看备份的结果,我发现Crontab已经多次调用了我的备份脚本,导致多个备份同时运行。
如果同一个脚本已在执行,我有什么方法可以确保某个shell脚本无法运行?
答案 0 :(得分:34)
没有竞争条件或提前退出问题的解决方案是使用锁定文件。 flock
实用程序处理得非常好,可以像这样使用:
flock -n /var/run/your.lockfile -c /your/script
如果脚本已在运行,它将立即返回非0状态。
答案 1 :(得分:7)
这样做的通常和简单的方法是提出类似的内容:
if [[ -f /tmp/myscript.running ]] ; then
exit
fi
touch /tmp/myscript.running
位于脚本顶部,
rm -f /tmp/myscript.running
最后,以及trap
函数,以防它没有到达终点。
这仍然存在一些潜在问题(例如顶部的竞争条件),但绝大多数情况都会出现。
答案 2 :(得分:5)
没有锁定文件的好方法:
ps | grep $0 | grep -v grep > /var/tmp/$0.pid
pids=$(cat /var/tmp/$0.pid | cut -d ' ' -f 1)
for pid in $pids
do
if [ $pid -ne $$ ]; then
logprint " $0 is already running. Exiting"
exit 7
fi
done
rm -f /var/tmp/$0.pid
这没有锁定文件,这很酷。 ps进入临时文件,刮掉第一个字段(pid#)并寻找自己。如果我们找到一个不同的,那么有人已经在运行。 grep $ 0是将列表缩短为这个程序的那些实例,而grep -v grep除去了grep本身的那一行:)
答案 3 :(得分:0)
您可以使用tmp文件 将其命名为tmpCronBkp.a,tmpCronBkp.b,tmpCronBkp.c ...等。发布了备份脚本。
在脚本开始时创建它并在结尾删除它...
请稍后检查文件是否存在以及存在哪个文件。
你试过这种方式吗?