2014-04-14 120 views
7

我试图每5分钟运行一次该脚本。看起来在OpenShift上运行CRON作业的唯一方法是使用他们的CRON插件。而CRON插件只允许每小时和每天脚本(通过将脚本放置在相应的文件夹中)。在OpenShift(红帽云)上每5分钟运行CRON作业

我试图运行此脚本每5分钟:

#!/bin/bash 
php /var/lib/openshift/53434c795973ca1ddc000668/app-root/runtime/repo/scheduled.php > /dev/null 2>&1 

但现在它运行,每分钟(因为它放置在微小的文件夹)。

我该如何重写它以便每5分钟运行一次?

回答

10

修改脚本以便检查当前时间,如果不是5分钟的倍数,则跳出。

像这样:

#!/bin/bash 

minute=$(date +%M) 
if [[ $minute =~ [05]$ ]]; then 
    php ... 
fi 

=~所述操作者的右操作数是一个正则表达式;如果当前分钟在05结束,则上述匹配。若干其他方法是可能的:

if [[ $minute =~ .[05] ]]; then 

(检查是否有任何字符,接着是一个或05; $minute总是正好2个字符)。

(用户theshadowmonkey表明在注释:

if [ $(($minute % 5)) -eq 0 ]; then 

,其检查算术$minute是否为5的倍数,但有一个问题是,在一个$((...))表达的表达,带前导零常数当作八进制;如果是目前的每小时8或9分钟后,恒0809是一个错误你可以解决这个与sed,但考虑到还有其他的解决方案可能是不值得)

+1

以上的答案是错误的,从执行50-59分钟,每分钟。所以这个改变会改变条件为“if [$(($ minute%5))-eq 0]; then”并且它有效。由于某种原因,我的编辑被拒绝了。所以,我只是在评论中留下正确的答案。作者或其他人随时可以用本声明编辑答案。 – theshadowmonkey

+1

@theshadowmonkey:完成。感谢您的支持。我已经包括了几个选择(这可能是矫枉过正)。 –

+1

@theshadowmonkey使用if [$(($ minute%5))-eq 0];那么我得到的错误:08:价值太大基地(错误标记是“08”) –

8

我。将e xtend Keith Thompson回答:

他的解决方案每隔5分钟完美工作一次,但不会工作,比如说,每13分钟一次;如果我们使用$minutes % 13我们得到这个时间表:

5:13 
5:26 
5:30 
5:52 
6:00 because 0%13 is 0 
6:13 
... 

我相信你会注意到这个问题。我们可以实现任意频率,如果再算上分钟(,小时,天或数周),因为Epoch

#!/bin/bash 

minutesSinceEpoch=$(($(date +'%s/60'))) 

if [[ $(($minutesSinceEpoch % 13)) -eq 0 ]]; then 
    php [...] 
fi 

date(1)返回当前的日期,我们因为大纪元格式设置为秒(%s),然后我们做基本的数学:

# .---------------------- bash command substitution 
# |.--------------------- bash arithmetic expansion 
# || .------------------- bash command substitution 
# || | .---------------- date command 
# || | | .------------ FORMAT argument 
# || | | |  .----- formula to calculate minutes/hours/days/etc is included into the format string passed to date command 
# || | | |  | 
# ** * * *  * 
    $(($(date +'%s/60'))) 
# * * --------------- 
# | |  | 
# | |  ·----------- date should result in something like "1438390397/60" 
# | ·-------------------- it gets evaluated as an expression. (the maths) 
# ·---------------------- and we can store it 

而且你可以使用在OpenShift与每小时,每天或每月cron作业这种方法:

#!/bin/bash 
# We can get the 

minutes=$(($(date +'%s/60'))) 
hours=$(($(date +'%s/60/60'))) 
days=$(($(date +'%s/60/60/24'))) 
weeks=$(($(date +'%s/60/60/24/7'))) 

# or even 

moons=$(($(date +'%s/60/60/24/656'))) 

# passed since Epoch and define a frequency 
# let's say, every 7 hours 

if [[ $(($hours % 7)) -ne 0 ]]; then 
    exit 0 
fi 

# and your actual script starts here 

的NotI我使用了-ne(不等于)运算符来退出脚本,而不是使用-eq(等于)运算符将脚本包装到IF构造中;我发现它很方便。

并记住为您的频率使用正确的.openshift/cron/{minutely,hourly,daily,weekly,monthly}/文件夹。

0

您可以利用每分钟 cron工作可用。作业按指定的频率运行,您可以检查作业的运行日期和/或时间。

以下是每5分钟运行一次作业的示例。将下面的代码片段放置在路径.openshift/cron/minutely/awesome_job的可执行文件中,并给予适当的权限chmod +x awesome_job然后将其添加到您的应用程序存储库中,提交并推送。

的片段

#!/bin/bash 
if [ ! -f $OPENSHIFT_DATA_DIR/last_run ]; then 
    touch $OPENSHIFT_DATA_DIR/last_run 
fi 
if [[ $(find $OPENSHIFT_DATA_DIR/last_run -mmin +4) ]]; then #run every 5 mins 
    rm -f $OPENSHIFT_DATA_DIR/last_run 
    touch $OPENSHIFT_DATA_DIR/last_run 
    # The 'awesome_command(s)' that you want to run every 5 minutes 
fi 

说明:

  • 这段代码实际上创建了一个名为“last_run”一个空文件只是为了 记下最后的运行状态,然后开始你的工作。
  • 接下来的一分钟,你的'awesome_job'将被执行,现在它会尝试在最后4分钟内找到修改过的文件'last_run'。但是您的 文件'last_run'是在一分钟前创建的,因此该条件失败并退出。这继续。
  • 在第五分钟,当发现(与-mmin +4),你的'last_run'将被显示,现在,文件'last_run'将被删除并重新创建,你的真棒命令将被执行。

源(官方文档):https://developers.openshift.com/managing-your-applications/background-jobs.html#_execution_timing