安排cron条目只有在尚未运行时才运行脚本

我正在执行jar文件的crontab有一个shell脚本。 Jar文件正在将文件从一台服务器移动到另一台服务器。 在繁忙时间需要10分钟以上(超过crontab条目)。

如何才能确保cron作业不会执行过程,直到最后一个没有完成?

一个简单的方法是让你的Cron启动一个bash文件来检查这个过程是否存在。

cron的:

  */10 * * * * /path/to/bashscript.sh 

(确保它有正确的用户并且是可执行的)

pgrep命令查找具有给定名称的进程,并在找到此进程时返回processID。

 #!/bin/bash # bashscript.sh pID=$(pgrep -n "yourjarfile") # Check if jarfile is running if $pID > /dev/null then #log something to syslog logger $pID "already running. not restarting." else # start jar file /usr/bin/java -jar /path/to/yourjarfile.jar fi 

– 编辑 –

受到F. Hauri的回答(可以很好地工作)的启发,我想出了一个更短的版本:

  */10 * * * * pgrep -n "yourjarfile." || /usr/bin/java -jar /path/to/yourjarfile.jar 

您可以直接在cron条目中使用一个穷人的锁文件,例如:

* * * * * LOCKFILE=whatever; [ ! -f $LOCKFILE ] && (touch $LOCKFILE && /path/to/java javaargs ; rm $LOCKFILE)

Crontab无法控制脚本的执行,使你想要的东西,你必须使用别的东西。 我能想到的更简单的方法是创建和监视包含执行任务状态的文件。 首先在与调用Java的bash脚本相同的目录下创建一个控制文件:$ echo 0> javaisrun.txt

在此之后,您可以拥有自己的脚本来检查Java是否正在运行,并采取适当的响应,如下所示:

 #!/bin/bash A=$(cat javaisrun.txt) if [ $A = 1 ]; then echo Java is running already else echo Not Running, start Java echo 1 > javaisrun.txt java -jar temp3.jar echo Java job is done, restoring state file echo 0 > javaisrun.txt fi 

脚本将读取“javaisrun.txt”文件,取其价值并决定继续使用Java,或者在Java执行时和执行后不对文件执行更新。

我有时候会用这种方法:

 */10 * * * * ps -C javaws www| grep -q mytool.jar || javaws ... mytool.jar 

不是非常性感,但高效。

我使用类似罗德里戈的答案的方法,但也将信号量清理降级到克朗。 就像是:

 * * * * * cd workdir; S=<a lockfile name>; touch $S; myjob jobparams; rm $S 

这样,如果某种程度上工作崩溃或有人将其杀死,cron将负责删除锁定文件。 这不是万无一失的,但对我来说运作良好。