2015-12-16 625 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

相关问题