2014-12-10 48 views
7

我遇到了一個情況,我認爲每55分鐘運行一個cron作業實際上是在小時的最後一小時之後55分鐘運行的。實際上,這不是一個cron工作,但它是一個使用cron語法的PHP scheduling application克朗「步驟」如何工作?

當我要求此應用程序每55分鐘計劃一次作業時,它會創建一個類似於以下內容的crontab行。

*/55 * * * * 

此行的crontab結束運行作業每55分鐘。相反,工作時間在55分鐘後,並在一小時的時間。我不希望這樣。我已經運行這個雖然cron tester,並驗證不良行爲是正確的cron行爲。

這使我查找/實際上的含義。當我看到cron manual時,我得知斜線表示「步驟」,但手冊本身有點模糊,因此這意味着

步長值可以與範圍結合使用。在「<number>」範圍之後指定在該範圍內跳過數字值。例如,可以在小時字段中使用「0-23/2」以指定每隔一小時執行一次命令(V7標準中的替代方法是「0,2,4,6,8,10,12,14,16,18,20,22"」)。星號後也允許執行步驟,因此如果您想說「每兩小時」,只要使用‘*/2’。

本手冊的描述(‘通過的範圍內指定數字的值的跳躍’)是一點點模糊,並且‘每兩小時’的例子是有點誤導(這是大概是什麼導致了應用程序的bug)

於是,兩個問題:

  1. unix cron程序如何使用「步驟」信息(斜線後的數字)來決定是否應該跳過運行作業? (模塊化的部門?如果是這樣,在什麼情況下決定一個「真正的」運行,哪些決定沒有?或者是別的什麼?)

  2. 是否可以配置一個unix cron作業來運行每個「 N「分鐘?

+0

@shellter我不想在一小時後只運行55次,我想每55分鐘運行一次。時間過後在55點跑,每小時一次。更重要的是,我想知道「步驟」功能實際上是如何工作的,以及是否可以說「每N分鐘」,而不管N是什麼。 – 2014-12-10 23:16:15

+0

對於反對/接近 - 這個問題是關於cron的調度邏輯是如何被編程的**,以支持使用cron邏輯的PHP程序包編寫軟件。這似乎很主題 – 2014-12-11 17:18:44

回答

8

步長值可以與範圍結合使用。在範圍 和「<number>」之間指定數字在整個範圍內的跳躍。例如,對於 示例,可以在小時字段中使用「0-23/2」來指定每隔1小時執行一次命令 (V7標準中的替代項爲 「0,2,4,6,8,10,12,14,16,18,20,22」)。星號後 也允許採用步驟,所以如果您想要說「每兩小時」,只需使用「*/2」即可。

的「範圍」在這裏被稱爲是/之前給定的範圍內,這是時間的特定字段中的範圍的子範圍。第一個字段指定一小時內的分鐘數,因此*/...指定的範圍是從0到59.第一個字段*/55指定55的倍數的所有分鐘數(在0-55範圍內),即,每小時後0分鐘和55分鐘。

同樣,0-23/2或第二(小時)*/2字段指定所有小時數是2的

倍數(範圍0-23內)如果指定比在0開始以外的範圍內,數(例如N)在/之後指定每個分鐘/小時/等在範圍的下限處開始。例如,第二欄中的3-23/7表示從03:00(03:00,10:00,17:00)開始的每7小時。

當您想要將時間間隔平均分配到下一個更高的時間單位時,這種方式效果最佳。例如,您可以輕鬆地指定每1,2,3,4,5,6,10,12,15,20或30分鐘或每1,2,3,4,6或12個事件發生的事件小時。 (感謝巴比倫人選擇具有這麼多好的除數的時間單位)。

不幸的是,cron沒有在一個小時以上的時間範圍內「每55分鐘」的概念。

如果你想每55分鐘運行一次作業(比如在00:00,00:55,01:50,02:45等),你必須間接地執行作業。一種方法是安排腳本每5分鐘運行一次;腳本然後檢查當前時間,並且每11次調用一次它的工作。

或者你可以在你的crontab文件中使用多行在00:00,00:55,01:50等處執行相同的工作 - 除了一天不是55分鐘的倍數。如果您不介意每天,每週或每月的時間間隔更長或更短,您可以編寫一個程序,以便根據需要生成一個包含儘可能多條目的大型crontab,它們都會在指定的時間運行相同的命令。

+0

謝謝基思,這比手冊更有幫助。 「倍數」是否合適?如果我指定「1-59/55」,我最終會得到一小時一小時和一小時後56小時的工作。準確地說一個步驟將會是1.始終運行一個範圍的第一個數字2.然後以該範圍中指定的量向前跑,如果產生的前面的跳躍仍然在相同的範圍內,則運行。3.重複2,直到產生的跳躍不在相同的範圍內 – 2014-12-11 00:13:29

+1

感謝Kieth,總是需要至少兩個程序員以正確的方式擰上燈泡:) – 2014-12-11 00:29:40

+0

這是否意味着幾個月(從1開始),*/2是奇數個月還是偶數?那麼*/2和1-12/2月之間有區別嗎? – 2016-09-27 17:41:50