2009-08-16 11 views
3

私は私のテストコードはどのようなものであるか、Proc::Daemonを使用する前に、いくつかのテストコードを書く:Proc :: Daemonの使用中に私のプログラムがファイルに書き込まないのはなぜですか?

#! /usr/bin/perl 

use strict; 
use warnings; 
use Proc::Daemon; 

Proc::Daemon::Init(); 
my $continue = 1; 
$SIG{TERM} = sub { $continue = 0 ; } 

while ($continue) { 
    sleep(5) ; 
    &greeting ; 
} 

sub greeting { 
    open (FH, ">>/home/daogu/foo") or die "can't open it" ; 
    print FH "hello word\n" ; 
    close FH ; 
} 

私はおもちゃのデーモンを起動した後、私は何も、実際に「foo」に書かれていない見つけました。誰がなぜこれが起こるのか説明できますか?ありがとう。

+2

どうやら$が続くデーモンラインで、閉じたファイルハンドル用の$ FH上のデーモン線21 印刷()で拒否された許可は、いつかあなたが 『スリープ5』から目を覚ます前に0になります。いくつかの基本的なデバッグは、おそらくあなたが何が起こっているのかを理解するのに役立ちますし、おそらくウェブサイトに貼り付けるより時間がかかりませんでした。 – jrockway

+0

私は、9行目の最後にセミコロンが必要だと思います: '$ SIG {TERM} = sub {$ continue = 0; }; 'これはタイプミスかもしれませんが、根本的な問題ではないと思います。 – Telemachus

+0

は 'open()'の3つの引数形式を使います。 –

答えて

7

まず、あなたは、9行上の割り当てを終了するためにセミコロンが必要スクリプトとここでそれを逃した。

それ以上に、私はGussが正しいと思っており、あなたには許可の問題があります。確認する方法は次のとおりです。別の端末を開き、topを実行してください。デーモンスクリプトを起動すると、Perlプロセスが表示されます。問題がパーミッションであれば、Perlプロセスが消えるのをすぐに知ることができます。スクリプトはサブルーチンで終了しますが、デーモンはその時点で端末にアクセスできないので、有用なエラーメッセージへの表示は決して表示されません。

このテストを簡単に変更するには、サブルーチンのdie〜に変更します。そうした場合、デーモンは引き続き永久に実行されます(これを確認するには、topを実行している端末を確認してください)。しかし、問題が許可されている場合、はまだに作成または書き込みされるファイルは表示されません。

編集:いいえ、STDERR = dead、サイレントデーモンに対するアクセス権はありません。このバージョンを試してみてください、しかし、あなたあなたはSTDERRのためのスイッチログインに書き込むことができることを確認してください:

Proc::Daemon::Init(); 
my $continue = 1; 
$SIG{TERM} = sub { $continue = 0 ; }; 

while ($continue) { 
    sleep(5); 
    greeting(); 
} 

sub greeting { 
    open STDERR, '>>', '/Users/telemachus/log' 
     or die "Can't reopen STDERR to log: $!"; 
    open my $fh, '>>', '/usr/local/foo' 
     or warn "Can't open /usr/local/foo for writing: $!"; 
    print $fh "hello word\n"; 
    close $fh; 
} 

あなたのログにこれの全体の多くを参照してくださいする可能性がある:

ことができます書き込み用「がトンオープンFOO:22

+0

私はいつもstrace(1)が元のコードを変更することなくこれらの状況を追跡する上で大きな助けになると思っています。 –

+0

@Dominic:「元のコードを変更せずに」私には非常に魅力的ですが、私はあなたにうそをつくことはできません。私は私の人生を救うために 'strace'(あるいは' dtrace'と 'dtruss')の出力を解読できませんでした。私は本当にどのように学ぶ必要があります。 – Telemachus

3

あなたのスクリプトは私にはうまく見えます。おそらく問題はファイルアクセス権だけです。ファイルが作成されるはずのディレクトリへの書き込みアクセス権があること、またはファイル自体に書き込みアクセス権があるファイルが既に存在することを確認してください。

私のマシンでスクリプトを実行しても問題なく動作します。私はあなたのプログラムも実行されませんので、私はあなたがいることを持って推測している、と付け加えまで

$SIG{TERM} = sub { $continue = 0 ; }; 

+1

本当ですか? 9行目にセミコロンがない場合でも?私の実験では、これは 'デーモン行11のシンタックスエラー、近く) '{{'}と続きました。 – Telemachus

+0

確かに、私はそれを修正しました - 私はちょうどコンパイラがすぐに問題を警告するように注意することは重要ではないと思った。 – Guss

+1

十分に公正で、私はそれのためにあなたをdownvoteしなかった。しかし、あなたのプログラムはコンパイルされないので、私には奇妙だった "あなたのスクリプトは私にはうまく見える"と言う。 Perlはあなたに "私はベッドを濡らしている"と言っていますが、どこで正確に言いません。 (簡単に見つけることができますが、コンパイラは文字通り「9行目の匿名サブルーチンの最後にセミコロンが必要です」ということはありません。私にとって大きな問題は、セミコロン匿名のサブシステムはPerlでかなり一般的な問題ですので、言及する価値はあると思います。コンパイラのヒントは、セミコロンが必要であることが分かっていれば見つけるのが簡単です。 – Telemachus

関連する問題