防止Bash脚本并行运行或使用cron重叠

如果我在我的cron表中有以下条目:

00 03 * * * /java_prog1.sh 00 5 * * * /java_prog2.sh 

第一份工作通常需要大约30分钟才能完成。 第二份工作大约需要10分钟。 有一些特殊的情况,第一份工作需要两个多小时。

有没有办法configuration这两个工作,以便第二个工作不开始,如果第一个仍在运行?

我已经看到了几个使用像flock这样的工具的例子,但是我认为这里并不适用flock,因为我并不想阻止同一个作业同时运行。 如果前一个仍在运行,我正试图阻止另一个工作开始。

只是在评论中已经存在的建议之上添加一些内容。

放在java_prog1.sh的开头:

 [ -f /var/run/java_prog1.sh.pid ] && exit echo "$$" > /var/run/java_prog1.sh.pid ... everything else our script does ... rm -f /var/run/java_prog1.sh.pid 

然后在java_prog2.sh的开头:

 [ -f /var/run/java_prog1.sh.pid ] && exit ... the rest of your java_prog2.sh ... 

要么:

 if [ -f /var/run/java_prog1.sh.pid ]; then kill -0 `cat /var/run/java_prog1.sh.pid` > /dev/null 2>&1 && exit fi ... the rest of your java_prog2.sh ... 

第一个将立即退出,如果一个文件(可能和可能包含第一个脚本的PID)存在。 第二个将只在文件存在的情况下退出,并且在该文件中有一个PID进程在进程表中( kill -0将返回0以防万一)。

就实际脚本而言,您可能需要尝试一下。 这只是给你一个可行的想法。

有没有办法配置这两个工作,以便第二个工作不开始,如果第一个仍在运行?

由于我不能评论,我会给你另一个例子,你可以考虑,但当然@ sami-laine解决方案更优雅。

你可以简单地编辑一个配置文件:

在启动时:

 echo 0 > file.config 

在你的/java_prog1.sh中:

 echo 1 > file.config # at the beginning of the script do something ... echo 0 > file.config # at the end of script #let the other script know that the job was finished 

在你的/java_prog2.sh中:

 while [ `cat file.config` -eq 1 ] ; do sleep 5; done # Wait whatever want