0

サーバーのタイムスタンプ付きの ping RTT を継続的にログに記録するために、次のコードを作成しました。スクリプトはコマンド ラインでファイルを実行していますが、ログ ファイル Ping_10.112.114.11.txt が空で、コードにエラー、警告、または構文エラーが表示されません。

以下は私のコードです:

#!/user/bin/perl


use Net::Ping;
use Time::HiRes;
use strict;

open (LOG , ">Ping_10.112.114.11.txt") || die "Cannot create log file :$!";

print LOG "File is ready to write\n\n";
my $host ="10.112.114.11";
my $p = Net::Ping->new();       #tcp echo request for ping check
$p->hires();

do  
{   my ($ret, $duration, $ip) = $p->ping($host);
my $time = localtime;
my $dur = (int(1000*$duration))/1000;
print "$time\t$host is alive (packet RTT: $dur ms)\n";
print LOG "$time\t$host is alive (packet RTT: $dur ms)\n";
}   while(1);

#END

また、出力を変数に保存してからファイルハンドルに送信して印刷しようとしましたが、残念ながら私の努力はどれもうまく機能していないようです。

my $output = ""$time\t$host is alive (packet RTT: $dur ms)\n";
print LOG "$output";

同じ perl 構文を使用しているが正常に動作する多くのスクリプトを書いているので、誰かが私の愚かな間違いを強調するのを手伝ってくれませんか?

私の全体的な要求の合間に、サーバーの RTT と接続をタイムスタンプ付きで継続的にログ ファイルに記録するスクリプトを作成する必要があります。追加のタイムスタンプ値を含む Ping -t からの出力と同様です。

前もって感謝します :)

4

1 に答える 1

2

問題は、ファイルへの出力がバッファリングされ、バッファがいっぱいになってファイルにフラッシュされるのを十分に待機していないことである可能性があります。autoflush を有効にすると、これが修正されます。コードには他にもいくつかの問題があります。このリファクタリングは、あなたが望むことをするはずです。

use strict;
use warnings;

use Net::Ping;
use Time::HiRes;

my $host = '10.112.114.11';

STDOUT->autoflush;

open my $log, '>', "Ping_$host.txt" or die "Cannot create log file: $!";
$log->autoflush;

my $p = Net::Ping->new;
$p->hires;

while () {
  my ($ret, $duration, $ip) = $p->ping($host);
  my $event = sprintf "%s\t%s is alive (packet RTT: %.3fms)\n",
      scalar localtime, $host, $duration;
  print STDOUT $event;
  print $log $event;
}
于 2013-01-08T13:05:59.953 に答える