2012-11-12 81 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