0

假设我有这样的东西(原谅糟糕的 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 根本没有帮助。

谢谢。

4

2 回答 2

1

你有点已经检查过它,因为它没有死。

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

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

于 2012-11-12T20:04:59.270 回答
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 或其他一些分布式文件系统。

于 2012-11-12T20:09:29.120 回答