[英]Debugging filehandles from perl open()
假裝我有這樣的東西(原諒糟糕的Perl風格-這是Someone Else的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包含舊的時間戳記。
現在,腳本不會消失; 它成功完成,並向bash返回退出代碼0。 這是運行perl 5.10.1的Debian Linux機器。
所以我的問題是:如何檢查STATUS
? Data :: Dumper根本沒有幫助。
謝謝。
您已經檢查過它了,因為它沒有死。
可能是您的文件系統禁用了時間戳修改跟蹤。 查看mount命令的輸出,然后查看文件系統上的選項。
如果您認為文件的內容是錯誤的(與inode mtime相反),那么我建議您的系統時間已關閉或者時區環境與預期的不同。
這將是最可靠的。
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或其他分布式文件系統,否則我認為發布的代碼不會出現這種情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.