获取一个Unix脚本,每次都在同一时间运行

时间:2009-06-08 14:31:49

标签: unix cron sleep intervals

我正在编写一个脚本来捕获系统上的磁盘使用情况(是的,我知道有软件可以做到这一点)。出于数据库报告的目的,我希望数据点之间的间隔尽可能相等。例如,如果我每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。

5 个答案:

答案 0 :(得分:6)

cron将完成这项工作。

http://en.wikipedia.org/wiki/Cron

只需将其配置为在您需要的时间运行您的ksh脚本

答案 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可以提供非常精细的粒度。