如果我在我的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
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
while [ `cat file.config` -eq 1 ] ; do sleep 5; done # Wait whatever want