2010-04-06 27 views
0

我想運行我的紅寶石腳本x一天(數量可能會改變)我的linux框。如果我不希望它在同一時間發生,最好的方法是什麼?我想時間(小時和分鐘)是隨機如何每天運行我的腳本x次? (在Linux上的紅寶石)

我想用at命令。該腳本將在x小時/分鐘左右由at調用,然後該腳本將通過at設置另一個呼叫。不知道是否有更好的方法或只有紅寶石的方式。

+0

爲什麼需要隨機的時間? – Harriv 2010-04-06 06:00:50

+0

我會推特,所以它會更好,如果它發生在不同的時間。無論如何不是很好的編程的東西來解決? :-) – Radek 2010-04-06 06:03:20

回答

5

我會考慮使用at程序來運行程序(而不是直接使用cron,因爲cron確實只能在固定的時間表上運行)。我還會創建一個程序(我會使用Perl;您將使用Ruby)來安排一個隨機延遲,直到下一次作業執行。

您需要考慮在24小時內執行「x」次工作以及隨機性應如何工作至關重要。什麼是時代變異的範圍。例如,您可能會在午夜加上7分鐘的時間運行cron作業,例如,然後計劃'x'at作業在一天中均勻分佈,並且計劃中的隨機偏差爲±30分鐘。或者你可能更喜歡一種替代方案,它的平均差距爲24/x小時,並且有一定數量的隨機偏差。不同之處在於第一種機制可以保證你在當天得到x個事件(除非你做得太過分);第二個可能有時僅在24小時內獲得x-1個事件或x + 1個事件。

0

我想你可以設置一個cronjob,它調用一個bash腳本,它將隨機時間延遲執行,但我不知道你是否可以在cronjob中以某種方式做它。 你可以在this site上找到關於如何做到這一點的信息,如果你不知道crontab和cronjobs,你可以找到更多關於here的信息。

0

如果你想運行X次,每天,你的crontab項設置爲:

0 */X * * * command_to_run

其中X是你想火上作業的每小時間隔獲得所需的執行次數/天。例如,使用2每隔兩小時發射一次,每天總共執行12次處決。

在代碼中使用這個頂部,迫使它睡覺隨機時間到那個cron的時間間隔:

 
# How long the program takes to run, in seconds. Be liberal unless having 
# two instances running is OK. 
EXECUTION_TIME = 10 

INTERVAL = 2 * 60 * 60 - EXECUTION_TIME 

sleep(rand(INTERVAL)) 

的想法是,cron將會以固定的間隔啓動程序,但隨後將在繼續之前在該間隔內睡眠一些隨機數。

將EXECUTION_TIME的值更改爲無論您認爲運行代碼需要多長時間才能讓它有機會在下一個時間間隔之前完成。將INTERVAL中的「2」更改爲您的cron時間間隔。

我還沒有測試過,但它應該工作,或者至少讓你走上正確的道路。

+0

'sleep'是否需要任何CPU時間/電源? – Radek 2010-04-06 06:01:37

+0

@Radek:no;就CPU時間而言,睡眠本質上是「自由的」。 – 2010-04-06 06:11:51

+0

注意:這可能會產生x-1,因爲該過程可以在午夜之前開始,然後一直睡到午夜之後。 – dbemerlin 2010-04-06 06:38:51

1

我認爲調度器解決方案是有點限制的,爲了獲得最靈活的隨機動作,將腳本轉換爲守護進程並編寫循環/等待自己。

爲Ruby似乎是這樣的:http://raa.ruby-lang.org/project/daemons/

+0

我喜歡這個。我正在考慮這樣的事情...... – Radek 2010-04-06 08:32:29

+0

您可能想比較睡眠()設置的簡便性與設置守護進程,然後比較循環的編碼與睡眠與簡單睡眠的編碼。我很懶,會告訴代碼睡覺隨機時間。 – 2010-04-06 21:31:39