从perl open()调试文件句柄

时间:2012-11-12 19:56:47

标签: perl debugging typeglob

让我假装我有这样的东西(原谅不好的perl风格 - 这是别人的Perl。)

#!/usr/bin/perl

my $config_dir = '/var/config';
my $status_file = 'last_update.status';

my $host = shift;
chomp($host);

unless ( $host ) { die "Usage: $0 <hostname>\n"; }

open(STATUS,">$config_dir/$host/$status_file") or die "Could not open $config_dir/$host/$status_file for writing.  Aborting...\n";
print STATUS time() . "\n";
close(STATUS);

它通过命令行调用,如update_status.pl foo

我期望发生的事情:/var/config/foo/last_update.status包含当前时间戳。

实际发生的事情:/var/config/foo/last_update.status包含旧的时间戳。

现在,脚本不会死掉;它成功完成并将退出代码0返回给bash。这是一个运行perl 5.10.1的Debian Linux盒子。

所以我的问题是:我如何检查STATUS? Data :: Dumper根本没用。

感谢。

2 个答案:

答案 0 :(得分:1)

你已经检查了它,因为它没有死亡。

可能是您的文件系统禁用了时间戳修改跟踪。查看mount命令的输出,并查看文件系统上的选项。

如果您认为该文件的内容错误(与inode mtime相反),那么我建议您的系统时间可能已关闭,或者您的时区环境可能与您不同期望的。

答案 1 :(得分:0)

这将是最可靠的。

use Data::Dumper qw( Dumper );

{
   local $Data::Dumper::Useqq = 1;
   local $Data::Dumper::Terse = 1;
   local $Data::Dumper::Indent = 0;
   print(Dumper(readlink("/proc/$$/fd/".fileno(STATUS))), "\n");
}

我怀疑错误与文件名有关。你确定你不只是误解了时间戳吗?

 perl -nlE'say "".localtime($_)' /var/config/foo/last_update.status

另一种可能性是您正在遭受缓冲,但我不认为您发布的代码可能就是这种情况,除非您使用的是NFS或其他分布式文件系统。