3

を使用する前に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" に何も書き込まれていないことがわかりました。なぜこれが起こるのか誰か説明できますか?ありがとう。

4

2 に答える 2

7

まず、9 行目で割り当てを終了するためにセミコロンが必要です。

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

私がそれを追加するまで、あなたのプログラムは実行さえしなかったので、スクリプトにそれがあり、ここで見逃していたと思います.

それを超えて、私は Guss が正しいと思います、そしてあなたにはパーミッションの問題があります。確認方法はこちら。別のターミナルを開いて実行しますtop。デーモン スクリプトを開始すると、Perl プロセスが表示されます。問題が権限にある場合は、Perl プロセスがすぐに消えます。スクリプトはサブルーチンで終了しますが、その時点でデーモンが端末にアクセスできないため、役立つエラー メッセージが表示されません。

このテストを変更する簡単な方法diewarn、サブルーチンで変更することです。これを行うと、デーモンは永久に実行され続けます (topこれを確認するには、実行中のターミナルをチェックしてください)。ただし、問題がアクセス許可にある場合でも、ファイルが作成されたり書き込まれたりすることはありません。

編集:はい、権限の問題+ STDERRへのアクセスなし=デッド、サイレントデーモン。このバージョンを試してください。ただし、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 を開けません: デーモン ライン 21 で権限が拒否されました。デーモン ライン 22 で閉じられたファイルハンドル $fh に対する print()。

于 2009-08-16T16:26:03.803 に答える
3

あなたのスクリプトは私にはうまく見えます。ほとんどの場合、問題は単なるファイルのアクセス許可です。ファイルが作成されるディレクトリへの書き込みアクセス権があることを確認するか、ファイルが既に存在する場合は、ファイル自体への書き込みアクセス権を持っていることを確認してください。

スクリプトを自分のマシンで実行すると、問題なく動作します。

于 2009-08-16T15:55:47.070 に答える