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 分ごとの場合に機能する方法を書きましたが、ポーリング時間を別の数値に変更すると機能しません。投票時間に柔軟に対応してほしい。

私はこれをシェル スクリプトで行うことを好みますが、コードが多すぎる場合は、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 秒ごとに実行するようにスケジュールします。

編集:あなたの要求を誤解したかもしれません。次の行に沿って何かをもっと探していますか? (ここに 1 つまたは 2 つのバグがあると思われます):

別の編集: 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 に答える