2015-09-20 155 views
3

我正在調試一個守護進程,我試圖使用print語句將信息輸出到終端。我的代碼的要點是:爲什麼我的perl守護進程不能打印?

#!/usr/bin/env perl 

use strict; 
use warnings; 

use Readonly; 

Readonly my $TIMEOUT => ...; 

... 

while (1) { 

    print "DEBUG INFO"; 

    ... 

    sleep $TIMEOUT; 
} 

但是,沒有輸出它打印到我的終端。爲什麼是這樣?

+0

守護進程的STDOUT通常有目的地指向終端以外的某個地方。你是如何守護程序的? – ikegami

回答

7

摘要:

使用$| = 1或換行,"\n"添加到打印。

說明:

這不是打印到終端的原因是因爲Perl正在緩衝對效率的輸出。一旦打印緩衝區被填滿,它將被刷新並且輸出將出現在您的終端中。您可能希望強制沖洗緩衝區,因爲根據您的輸出長度,您可能會等待相當長的時間!

主要有兩種方法來刷新緩衝區:

1)當你打印到你的終端,那麼你的文件句柄是最有可能STDOUT。把手附連到終端的任何文件都默認在行緩衝模式,我們可以刷新緩衝區,並通過添加一個新行字符到您print語句強制輸出:

while (1) { 
    print "DEBUG INFO\n"; 
    ... 
    sleep $TIMEOUT; 
} 

2)第二種方法是使用$|,當設置爲非零時,使當前文件句柄(默認爲STDOUT或最後爲select ed)並立即強制刷新緩衝區。因此,以下也將迫使調試信息打印:

$| = 1; 
while (1) { 
    print "DEBUG INFO"; 
    ... 
    sleep $TIMEOUT; 
} 

如果使用語法,如這是混亂的,那麼你可能要考慮:

use IO::Handle; 
STDOUT->autoflush(1); 

while (1) { 
    print "DEBUG INFO"; 
    ... 
    sleep $TIMEOUT; 
} 

在許多代碼示例,其中直接沖洗的緩衝區是必需的,你可能會看到$|++用於使文件句柄變熱並立即刷新緩衝區,並且--$|使文件句柄冷卻並關閉自動刷新。看到這兩個答案,瞭解更多詳情:

如果您有興趣學習更多關於Perl的緩衝區,那麼我建議閱讀Suffering from Buffering,這給了偉大的洞察爲什麼我們有緩衝並解釋如何打開和關閉它。

相關問題