安排cron条目仅在尚未运行时运行脚本

时间:2015-04-23 07:18:05

标签: linux shell cron synchronization crontab

我在crontab中有一个执行jar文件的shell脚本。 Jar文件正在将文件从一台服务器移动到另一台服在高峰时段,它需要超过10分钟(超过crontab条目。)

如何确保cron作业在最后一个作业完成之前不会执行过程?

4 个答案:

答案 0 :(得分:5)

一种简单的方法是让您的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

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

我有时会使用这种技巧:

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

不是很性感,但效率很高。

答案 3 :(得分:0)

我使用的方法类似于罗德里戈的答案,但也将信号量清理降级为cron。类似的东西:

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

这样一来,如果某个工作崩溃或有人将其杀死,cron将负责删除锁定文件。它并非万无一失,但对我来说效果很好。