1

daemonize を使用してデーモンプロセスを作成し、log という名前のファイルに何かを書き込みますが、実行すると機能しませんでした。

ログに書き込めなかったのはなぜですか?

use POSIX;

sub daemonize{
    chdir '/';
    umask 0;
    open STDIN,'/dev/null'   || die "can not open /dev/null:$!";
    open STDOUT,'>/dev/null' || die "can not open /dev/null:$!";
    open STDERR,'>/dev/null' ||die "can not open /dev/null:$!";
    defined ($pid=fork) || die "can not fork a process:$!";
    exit if $pid;
    setsid || die "can not create session:$!";
}

&daemonize;
open LOG,">>/dev02/ycq/test/log" ||die "can not open file:$!";
my $num=0;
while(1){
    print LOG "$num\n";
    sleep 1;
}
4

3 に答える 3

4

(または他の関数やサブルーチン) を使用する場合は、演算子の優先順位openを考慮する必要があります。あなたの場合、演算子は(コンマ)演算子よりも優先されます。||,

次のような行:

open LOG, "file.txt" ||die "can not open file:$!";

優先順位を考慮すると、実際にはこれを意味します。

open LOG, ("file.txt || die ...);

"file.txt"は真のステートメントであるため、ステートメントをトリガーすることはありませんdie

必要なのは次のいずれかです。

open(LOG, "file.txt") || die ...

また

open LOG, "file.txt" or die ...

最初のケースでは、括弧が演算子の優先順位をオーバーライドします。2 番目のケースでは、or演算子はコンマ演算子よりも優先順位が低くなります。

これが意味することは、open通話がサイレントに失敗した可能性があるということです.

于 2012-09-11T13:31:50.183 に答える
3

正確にどのようなエラーが発生しますか? バッファリングに苦しんでいる可能性があります。

open の 3 引数形式を使用する必要があります。

あなたchdirはあなたが思うところにあなたを置くつもりはありません。先頭に空白を付けて「/」を書きました。

Proc::Daemonも役に立つかもしれません。

于 2012-09-11T13:32:51.667 に答える
0

に余分なスペースがあるためかもしれませんchdir(' /')

于 2012-09-11T13:32:46.067 に答える