Shell脚本:确保在已经运行的情况下不执行脚本

时间:2011-01-22 15:58:17

标签: bash shell cron

  

可能重复:
  Quick-and-dirty way to ensure only one instance of a shell script is running at a time

我已经设置了一个cronjob来正确备份我的文件夹,我很自豪。但是,通过查看备份的结果,我发现Crontab已经多次调用了我的备份脚本,导致多个备份同时运行。

如果同一个脚本已在执行,我有什么方法可以确保某个shell脚本无法运行?

4 个答案:

答案 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 ...等。发布了备份脚本。

在脚本开始时创建它并在结尾删除它...

请稍后检查文件是否存在以及存在哪个文件。

你试过这种方式吗?