2014-04-14 150 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