Perl 无法使用下面的代码将连续Net::Ping输出写入日志文件

Perl 无法使用下面的代码将连续Net::Ping输出写入日志文件,perl,debugging,ping,continuous,Perl,Debugging,Ping,Continuous,我已经编写了以下代码来记录服务器的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

我已经编写了以下代码来记录服务器的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
我还尝试将输出保存到一个变量,然后将其发送到filehandle进行打印,但不幸的是,我的努力似乎都没有奏效

my $output = ""$time\t$host is alive (packet RTT: $dur ms)\n";
print LOG "$output";
有谁能帮我强调一下我的愚蠢错误,因为我已经写了很多脚本,它们使用相同的perl语法,但效果很好

我的总体要求是编写一个脚本,在日志文件中使用时间戳连续记录服务器的RTT和连接。与Ping-t的输出一样,它具有额外的时间戳值


提前感谢:)

问题可能是文件的输出已缓冲,并且您没有等待足够长的时间来填充缓冲区并刷新到文件。启用自动刷新将为您解决此问题,代码中还有一些其他问题。这种重构应该满足您的需要

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;
}

感谢博罗丁将冲洗问题公之于众。这可能是非日志打印的原因。但正如我看到的,代码中很少有像您没有定义$log变量这样的小错误。另外,我不确定“print$log$event;”是否有效。让我检查一下我的机器,谢谢你的帮助:)你的代码比我的好很多倍,也更好看,但是它的编译错误。D:\AVI MEHENWAL\PERL\SCRIPTS\PROJECTS\Ping Probe Server>PERL\u pingprobe\u flush.pl第27行“print”附近的PERL\u pingprobe\u flush.pl语法错误全局符号“$event”要求在PERL\u pingprobe\u flush.pl第27行显示包名。全局符号“$event”需要在perl_pingprobe_flush.pl第28行显示包名。由于编译错误,perl_pingprobe_flush.pl的执行被中止。我刚刚意识到我的代码缺少错误处理部分…感谢TLP和@Borodin代码现在工作得非常好。冲洗问题已解决。但我无法理解我的代码的刷新问题。。。因为我在某个地方读到perl具有动态和自动化的内存管理系统,那么为什么我们需要在perl代码中手动指定内存清除?它不是在代码运行时动态工作吗?动态内存分配与输出流缓冲无关,它将程序的输出累积到内存缓冲区中,并仅在缓冲区已满时将其写出。这是为了将磁盘IO减少到合理的最小值,但是需要实时输出的应用程序应该启用
autoflush
,它在每个
print
语句之后写入输出,而不是等待缓冲区填满。如果您将原始程序运行足够长的时间,那么您将看到最终显示的信息。一般来说,最好在控制台输出上启用
autoflush
,并保留磁盘流缓冲区。这让我完全满意!甚至给了我更清晰的概念。谢谢你,先生:)