Резюме:
Использование $| = 1
или добавить новую строку, "\n"
к печати.
Пояснение:
Причина этого не печатает на терминале происходит потому, что Perl буферизует выходные данные для повышения эффективности. Как только буфер печати будет заполнен, он будет очищен, и выход появится в вашем терминале. Может быть желательно, чтобы вы принудительно промывали буфер, так как в зависимости от длины $TIMEOUT
вы могли ожидать значительный отрезок времени для вывода!
Есть два основных подхода к промывке буфер:
1) Как вы печатаете на терминал, то ваш указатель_на_файл скорее всего STDOUT
. Любой файл ручка прилагается к терминалу, по умолчанию в режиме линейного буферного, и мы можем очистить буфер и заставить вывод, добавляя символ новой строки к вашему print
заявлению:
while (1) {
print "DEBUG INFO\n";
...
sleep $TIMEOUT;
}
2) Второй подход заключается в для использования $|
, который при установке на ненулевое значение делает текущую дескриптор файла (STDOUT
по умолчанию или последним будет select
ed) hot и немедленно выдает смыв буфера. Таким образом, следующее будет также принудительно печать отладочной информации:
$| = 1;
while (1) {
print "DEBUG INFO";
...
sleep $TIMEOUT;
}
При использовании синтаксиса, это сбивает с толку, то вы можете, как рассмотреть следующие вопросы:
use IO::Handle;
STDOUT->autoflush(1);
while (1) {
print "DEBUG INFO";
...
sleep $TIMEOUT;
}
Во многих примерах кода, где непосредственный смыва буфера требуется, вы можете увидеть, что $|++
используется для создания файла-дескриптора hot и немедленно сбрасывает буфер, и --$|
, чтобы сделать файл-дескриптор холодным и отключить авто-промывку. См эти два ответа для более подробной информации:
Если вы заинтересованы в получении дополнительной информации о PERL буферов, то я хотел бы предложить чтение Suffering from Buffering, что дает глубокое понимание того, почему мы буферизируем и объясняем, как включать и выключать его.
STDOUT демона обычно целенаправленно направлен куда-то, кроме терминала. Как вы демонизировали программу? – ikegami