2009-06-08 14 views
0

システムでディスク使用量をキャプチャするためのスクリプトを作成しています(これを実行できるソフトウェアはあります)。データベースレポートの目的のために、データポイント間の間隔をできるだけ等しくしたい。たとえば、ディスク使用率を10分ごとにポーリングしている場合は、すべてのデータポイントをYYYY-MM-DD HH:[0-5] 0:00にします。私が5分ごとに投票しているなら、それはYYYY-MM-DD HH:[0-5] [05]:00でしょう。毎回全く同じ時刻にUnixスクリプトを実行する

ディスクの使用状況をキャプチャするkshスクリプト(またはPerlスクリプト)がある場合、スナップショットを作成する前にスクリプトをアクティブにして次の "投票時間"を待つ方法はありますか?次の「投票時間」までの秒数を正確にしてください。 5分ごとにポーリングして11:42:00になると、180秒間寝て11:45:00にスナップショットを撮り、5分間スリープして別のスナップショットを撮る11:50:00に

ポーリング時間が10分ごとである場合には動作しますが、ポーリング時間を別の数に変更すると動作しません。私は投票時間に柔軟に対応したいと思います。

私はこれをシェルスクリプトで行うのが好きですが、コードが多すぎるとPerlもうまくいくでしょう。

これを達成するためのアイデアはありますか?

ありがとうございます!

ブライアン

EDIT:うわー - cronのが無効になっていることを、私はこの作業のためにcronを使用することはできません - 私はかなり重要な部分を残しました。私はそれを与えたすべての人々に非常に申し訳ありません、はい、それは私が望むことをするための完全な方法ですので、私はcronを使用することができます。

スケジューラを使用して毎日真夜中前にスクリプトを開始し、正確な「ポーリングタイム」でスクリプトを実行し、その間に眠って、真夜中に終了するようにします。

もう一度、crontabを明確にしないと非常に残念です。

+0

リアルタイム拡張機能を使用している場合を除き、*正確に*同じ時刻を取得することはできませんが、必要なものによっては十分に近いかもしれません。 –

答えて

2

をやっている、私はスケジュールするために、システムスケジューラ(cronまたは何か他のもの)を使用します私のプログラムは180秒ごとに実行されます。

EDIT:ご要望が間違っている可能性があります。あなたは次の行に沿って何かを探していますか? (私はここでは、バグや2がある疑いがある):

ANOTHER EDIT:::時間への依存を削除するローカル(しかし、今、私はより多くのバグ;-)

#!/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__ 
+0

+1の答えが正しいですが、私は編集でcronを使用できないことを明確にしました。私の質問でそれを残して申し訳ありません... – BrianH

+0

はい - それは私が探していたものです! kshが優先されますが、Perlは最小限の手間で終了すると思います。どうもありがとう! – BrianH

+0

@BrianHまあ、Perlに依存するのはTime :: Localモジュールだけです。 –

6

cronが仕事をします。

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

ちょうどあなたが必要とするタイミングで、あなたのkshのスクリプトを実行するように設定し、私はこれをやっていた場合は、

+0

あなたが正しかったので、答えは+1ですが、私は編集でcronを使用できないことを明確にしました。私の質問でそれを残して申し訳ありません... – BrianH

+1

Quartzを利用する単純なJavaアプリケーションを作成することができます。石英はこれを達成するためにすべての配管工事をしています。また、Springにはクォーツの使い方をさらに簡単にする素晴らしい機能があります。 – Reginaldo

1

はそれがために眠る存在が疑われます非常に短い時間、< = 1秒、ポーリング時間が到来したかどうか毎回チェックします。インクリメンタルプロセッサの使用はごくわずかです。

編集:どの間隔を使用するか分かっていて、頻繁に変更するつもりがない場合は、cronは問題ありません。しかし、間隔を頻繁に変更する場合は、短いスリープ時間で連続して実行されるスクリプトを検討してください。

+0

これは私がやっていることですが、これには、プログラム、データベース、または設定ファイルのいずれかでポーリング時間を何らかのハードコーディングする必要があります。私は24時間のすべてのポーリング時間を計算するアルゴリズムを書くことができると思うが、より良い方法があるように思える... – BrianH

+0

次に、質問は本当に、どのような要因がポーリング時間を決定し、どのような状況それは変わるだろうか?あなたがハードコーディングのダムプロセスの方法を超越したい場合は、ロジックを定義する必要があります。 –

3

cronを使用するとよいでしょう。これはまさにそれが作られたものです。

+0

+1の答えは正しいですが、私は編集でcronを使用できないことを明確にしました。私の質問でそれを残して申し訳ありません... – BrianH

0

時間分解能の細かさに応じて、スクリプトデーモンスタイルを記述する必要があるかもしれません。一度起動して(1)、プログラム内のロジックを実行します(再度実行するまで毎秒確認できます)。

PerlのTime :: HiResは、必要に応じて非常に細かい粒度を可能にします。

関連する問題