0

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

4

5 回答 5

6

cron 将完成这项工作。

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

只需将其配置为在您需要的时候运行您的 ksh 脚本,您就完成了

于 2009-06-08T14:34:04.290 回答
3

您可能要考虑使用cron. 这正是它的目的。

于 2009-06-08T14:35:33.333 回答
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__
于 2009-06-08T14:34:17.360 回答
1

让它休眠很短的时间,<=1 秒,并检查每次轮询时间是否已到。增量处理器使用将可以忽略不计。

编辑:如果您知道将使用什么间隔并且不打算经常更改,那么 cron 很好。但是,如果您经常更改间隔,请考虑使用短睡眠时间连续运行的脚本。

于 2009-06-08T14:35:09.293 回答
0

根据您的时间分辨率需要有多细,可能需要编写脚本守护程序样式。启动一次,while(1) 并执行程序内部的逻辑(您可以每秒检查一次,直到再次运行)。

如果您需要,Perl 的 Time::HiRes 允许非常精细的粒度。

于 2009-06-08T14:37:27.277 回答