2012-11-12 53 views
0

让我们假设我有这样的事情(原谅坏perl的风格 - 这是别人的Perl的。)调试文件句柄的open()

#!/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根本没有帮助。

谢谢。

+0

你需要关于文件句柄STATUS的什么信息? – Kenosis

+0

@Kenosis我正在寻找对应于绑定到'STATUS'的文件描述符的路径 –

+0

也许下面的讨论可能会有所帮助:[我能从Perl的文件句柄中找到一个文件名吗?](http:// stackoverflow。 com/questions/2813092/can-i-find-a-filename-from-a-filehandle-in-perl) – Kenosis

回答

1

你已经检查过它,因为它不会死亡。

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

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

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或其他一些分布式文件系统代码的情况。

+0

@Mark Allen,更新。 – ikegami