我正在编写一个脚本来捕获系统上的磁盘使用情况(是的,我知道有软件可以做到这一点)。出于数据库报告的目的,我希望数据点之间的间隔尽可能相等。例如,如果我每10分钟轮询一次磁盘使用情况,我希望每个数据点都是YYYY-MM-DD HH:[0-5] 0:00。如果我每5分钟轮询一次,那就是YYYY-MM-DD HH:[0-5] [05]:00。
如果我有一个ksh脚本(甚至是Perl脚本)来捕获磁盘使用情况,我怎么能让脚本活动并在拍摄快照之前等待下一个“轮询时间”,然后睡觉正确直到下一个“轮询时间”的秒数。如果我每5分钟轮询一次,它是11:42:00,那么我想睡眠180秒,这样它将在11:45:00拍摄快照 - 然后睡5分钟,这样就需要另一张快照在11:50:00。
如果我的民意调查时间是每10分钟,我写了一种方法,但如果我将民意调查时间更改为不同的号码,则无效。我希望它在民意调查时具有灵活性。
我更喜欢在shell脚本中执行此操作,但如果代码太多,Perl也会没问题。
关于如何实现这一目标的任何想法?
提前致谢!
布赖恩
编辑:哇 - 我遗漏了一个相当重要的部分 - cron已被禁用,因此我将无法使用cron执行此任务。我很抱歉给那些作为答案的人,因为是的,如果我能使用cron,那就是做我想要的完美方式。
我将使用我们的调度程序在每天午夜之前启动我的脚本,我希望脚本能够在确切的“轮询时间”处理,在两者之间睡觉,并在午夜退出。
再次,我很抱歉没有澄清crontabs。
答案 0 :(得分:6)
答案 1 :(得分:3)
您可能需要考虑使用cron
。这正是它的目的。
答案 2 :(得分:2)
如果我这样做,我会使用系统调度程序(cron
或其他)来安排我的程序每180秒运行一次。
编辑:我可能误解了您的请求。您是否正在寻找更多以下内容? (我怀疑这里有一两个错误):
另一个编辑:删除对Time :: Local的依赖(但现在我怀疑有更多错误; - )
#!/usr/bin/perl
use strict;
use warnings;
use POSIX qw( strftime );
my $mins = 5;
while ( 1 ) {
my ($this_sec, $this_min) = (localtime)[0 .. 1];
my $next_min = $mins * ( 1 + int( $this_min / $mins ) );
my $to_sleep = 60 * int( $next_min - $this_min - 1 )
+ 60 - $this_sec;
warn strftime('%Y:%m:%d %H:%M:%S - ', localtime),
"Sleeping '$to_sleep' seconds\n";
sleep $to_sleep;
}
__END__
答案 3 :(得分:1)
让它睡眠很短的时间,<= 1秒,并检查每次是否到达轮询时间。增量处理器的使用可以忽略不计。
编辑:如果您知道将使用的间隔并且不打算经常更改,则cron很好。但是如果你经常改变间隔,可以考虑一个连续运行的脚本,以及短暂的睡眠时间。
答案 4 :(得分:0)
根据您的时间分辨率需要精细程度,可能需要编写脚本守护程序样式。启动它一次,同时(1)并执行程序内的逻辑(你可以检查每一秒,直到它再次运行)。
Perl的时间::如果需要,HiRes可以提供非常精细的粒度。