让我假装我有这样的东西(原谅不好的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根本没用。
感谢。
答案 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或其他分布式文件系统。