我有一个用Perl编写的自定义nagios插件。出于复杂的政治原因,我需要隐藏此插件的源代码。我发现这样做的唯一方法是使用perlc(http://marginalhacks.com/Hacks/perlc)。
用作者的话说:
"采用单个perl脚本,使用带有可选定义键的简单编码转换块。脚本在运行时被解码并送到perl库,以避免它落入用户的手中。"
我得到的问题是Nagios显示"没有从插件返回输出"当我使用插件的编译版本时。原始perl源工作得很好。
调试一段时间后,我将问题缩小到使用perl中的exit。即
编译时效果很好。
print "OK: Everything is working fine.\n";
然而,这不起作用并导致""没有从插件返回输出"
print "OK: Everything is working fine.\n";
exit 1;
如何退出(0 1 2或3)并不重要我仍然遇到同样的问题。
答案 0 :(得分:0)
根据cross-posted PerlMonks thread,通过启用autoflushing来解决问题:
$| = 1;
来自perlvar
:
- HANDLE-> autoflush(EXPR)
- $ OUTPUT_AUTOFLUSH
$ |
如果设置为非零,则立即强制刷新并在每次写入或之后 在当前选定的输出通道上打印。默认值为0 (无论通道是否真的由系统缓冲或 不;
$|
仅告诉您是否已明确要求Perl进行刷新 每次写完后)。如果输出,STDOUT通常会进行行缓冲 到终端和否则缓冲块。设置此变量是 主要用于输出管道或插槽时,例如 当您在rsh下运行Perl程序并想要查看时 输出正在发生。
有关详细信息,请参阅文章Suffering from Buffering?。