簡體   English   中英

從perl open()調試文件句柄

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM