我正在执行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将负责删除锁定文件。 这不是万无一失的,但对我来说运作良好。