升级到Perl 5.24.4后,我们在日志中反复出现此错误(不指向文件名和行号):
无法清除标准输出:管道损坏
我们不知道导致此错误的原因。
有没有建议如何理解错误的原因?
答案 0 :(得分:5)
错误来自perl.c, line 595:
PerlIO_printf(PerlIO_stderr(), "Unable to flush stdout: %s",
Strerror(errno));
此行是perl_destruct
的一部分,在程序结束时调用该行以关闭perl解释器。
作为全局关闭过程的一部分,将清除所有仍打开的文件句柄(即,写出所有缓冲的输出)。上面的评论说:
/* Need to flush since END blocks can produce output */
/* flush stdout separately, since we can identify it */
该错误消息未在perldoc perldiag
中列出,这可以说是一个文档错误。它可能被忽略了,因为它不是真正的warn
或die
调用,实际上只是print STDERR $message
。它与文件名或行号无关,因为它仅在程序停止运行后(即在调用exit
之后或由于执行不在主脚本末尾而发生)发生。
答案 1 :(得分:2)
这是非常一般的建议,但是
use Carp::Always;
位于脚本顶部,或以
运行perl -MCarp::Always the_script.pl arg1 arg2 ...
将使Perl生成包含每个警告和错误的堆栈跟踪。
答案 2 :(得分:2)
<script src="https://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js" integrity="sha256-VazP97ZCwtekAsvgPBSUwPFKdrwD3unUfSGVYrahUqU=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.css" />
<div class="ui-widget">
<label for="tags">Tags: </label>
<input id="tags">
</div>
是与系统错误Broken pipe
相关的错误字符串。写入关闭的管道时,会收到此错误。通常,写入封闭的管道会导致SIGPIPE终止该进程,因此这意味着SIGPIPE的行为已从其默认值更改。
EPIPE
作为melpomene discovered,如果您在$ perl -e'
$SIG{PIPE} = "IGNORE";
print "foo\n"
or die("Can\x27t write to STDOUT: $!\n");
sleep(2);
close(STDOUT)
or die("Unable to flush STDOUT: $!\n");
' | perl -e'sleep(1)'
Unable to flush STDOUT: Broken pipe
块中写入断开的管道,则会自动输出错误。
END
这不一定是问题,尽管它可能表明进程过早退出。