我在crontab
中有一个执行jar文件的shell脚本。 Jar文件正在将文件从一台服务器移动到另一台服在高峰时段,它需要超过10分钟(超过crontab
条目。)
如何确保cron
作业在最后一个作业完成之前不会执行过程?
答案 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将负责删除锁定文件。它并非万无一失,但对我来说效果很好。