2015-12-16 266 views
1

我有一個寫入文件兩個日期時間的兩個服務器的腳本。該腳本每分鐘啓動一次,但存儲的第二個腳本並不總是相同的。如何在同一秒鐘內每分鐘運行一次腳本?

例:

2015-12-16 0:16:01.864 2015-12-16 0:16:01.972 
2015-12-16 0:17:01.241 2015-12-16 0:17:01.350 
2015-12-16 0:18:01.626 2015-12-16 0:18:01.735 
2015-12-16 0:19:02.102 2015-12-16 0:19:02.210 

正如你可以看到第四行寫有02秒並且不將01

在crontab中,我有這樣的情況:

* * * * * root cd /home/Project; ./PollDateServer.sh >/dev/null 2>&1 

謝謝你

+0

這真的取決於服務器。那時crontab會在''附近'運行它,但它不是100%肯定它就是那個時刻。如果你不得不依賴它,你可能需要在腳本中添加一個額外的檢查。 – fedorqui

+0

http://stackoverflow.com/questions/21920975/linux-task-schedule-to-hour-minute-second:看看http://quartz-scheduler.org/ –

+4

你不能問那種cron的準確性。你需要一個完全不同的解決方案,比如找到可能發展的東西?如果你不介意沿着這條路走下去,一小撮python/perl可以實現你想要的。 – Michael

回答

-1

如果你每分鐘開始一次腳本,你可以給「at」一個嘗試:

* * * * * echo 'cd /home/Project; ./PollDateServer.sh' | at now + 1 minutes 

「at」包必須安裝!

編輯:

更準確的版本,而 「在」:

* * * * * sleep $(echo 60-$(date '+\%S.\%N') | bc); cd /home/Project; ./PollDateServer.sh 

準確性至今:

22:10:00.007780247 
22:11:00.003994573 
22:12:00.007836359 
22:13:00.005249502 
22:14:00.003309822 
22:15:00.004220122 
22:16:00.004105306 
22:17:00.006213730 
22:18:00.006020664 
22:19:00.003666325 

它是如何工作的:

$ date '+%S.%N' 
17.416097038 
...

給出當前第二和納秒

$ echo 60-$(date '+%S.%N') 
60-17.416097038 

...產生來計算剩餘秒和納秒到下一整分鐘的表達式。

$ echo 60-$(date '+%S.%N') | bc 
42.583902962 

...計算剩餘秒和納秒到下一整分鐘

...終於睡那麼久:

$ sleep $(echo 60-$(date '+%S.%N') | bc); date '+%H:%M:%S.%N' 
12:10:00.004634130 

...睡在計算時間,並給返回當前時間

+2

錯誤,沒有。這絕對不會做OP所需要的。即使'at'得到了保證,或者甚至預計會比cron更準確,但如果cron調度員晚了一秒,那麼就職工作會遲到一分鐘。 – Michael

+0

是的......你說得對。這項工作延遲了一分鐘。但正如你在問題中所看到的那樣,這項工作意味着每分鐘都在運行。我的例子運行:每分鐘。 – st0ne

+0

在我的測試中,「at」-version比cron-only更準確。試一試。即使cron已經晚了幾秒鐘。 at-scheduler在下一分鐘的第二秒啓動腳本。在我看來,我的回答滿足了這個問題的兩個要求:它在同一秒內每分鐘運行一次。 – st0ne

相關問題