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);

so のようにコマンドライン経由で呼び出されます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

もう 1 つの可能性は、バッファリングに苦しんでいるということですが、NFS やその他の分散ファイル システムを使用していない限り、投稿したコードには当てはまらないと思います。

于 2012-11-12T20:09:29.120 に答える