2011-06-22 19 views
2

私はProc::Daemonを使って簡単なテストデーモンを書きました。ここでは、デーモンは次のとおりです。PerlデーモンがSleep()で動作しない

#!/usr/bin/perl 

use Proc::Daemon; 

$daemon = Proc::Daemon->new(
     work_dir  => '/scripts/', 
     child_STDOUT => '/scripts/child.log', 
     child_STDERR => '+>>debugchild.txt', 
     pid_file  => 'pid.txt', 
     exec_command => 'perl /scripts/test.pl' 
    ); 


foreach(@ARGV) 
{ 
if (/install/i) 
{ 
    $Kid_1_PID = $daemon->Init; 
} 
elsif (/remove/i) 
{ 
    $stopped = $daemon->Kill_Daemon(); 
} 
} 

そしてここでは、テストでは、それが実行されるということです。

#!/usr/local/bin/perl 

while (1) { 

print "test\n"; 
sleep(1); 
} 

をwhileループがちょうどprint文で正常に動作しますが、私は睡眠を(追加時)。ログは空です。これはなぜでしょうか?

答えて

5

Perlは自動的にバッファをフラッシュしないため、ファイルへの書き込みはかなり後に行われます。スリープ状態になっていないときは、書き込まれているデータ量によってバッファがほぼ自動的にフラッシュされます。

この試してみてください:あなたは$何を説明することができます

$| = 1; 
while (1) { 
    print "test\n"; 
    sleep(1); 
} 
+0

を| = 1は? – HighLife

+0

バッファにファイルを送るのに十分なバイトがあるまで待機するのではなく、各書き込み後にバッファをフラッシュするようにPerlに指示します。 – ADW

+0

最初の質問はこちら:http://perldoc.perl.org/perlfaq5.html – ADW

4

出力バッファリングと十分な忍耐はありませんか?ループ内にsleep(1)があると、十分なデータが蓄積され、ログファイルに書き出されるまでに時間がかかることがあります。

スクリプトの先頭に$|=1;文を挿入します。