我从ant调用perl进程并将输出重定向到文本文件。我必须限制该文件的大小(它可能完全失败进程或只是切断输出)。该文件可能会变得非常庞大,以至于它将占用剩余的磁盘空间。
build.xml的相关部分:
<exec dir="----" executable="perl" spawn="true">
<env key="PERL_CAPTURE_OUTPUT" value="${logdir}/jboss.out"/>
<arg value="runServer.pl"/>
</exec>
答案 0 :(得分:2)
假设您使用的是类似unix的系统,则可以使用ulimit
。
并调用您的脚本:
bash -c "ulimit -f <filesize> ; exec perl runServer.pl"
或者,您可以在脚本中保留跟踪或写入的字节,并在达到特定限制时退出。不应该很难修改你的脚本。
希望这有帮助。
更新:鉴于可移植性要求,最好跟踪您在perl脚本中编写的内容。在每次写入时,只需对字节求和,并在达到限制时终止。它比编写另一个perl脚本和管道更高效,更直接。此外,要在Windows上管道,您需要调用cmd.exe
和unix sh
,这是您的ant任务逻辑的复杂功能。 @amon信息虽然很好。
答案 1 :(得分:0)
你想要的(在* nix系统上)是head
程序。 E.g。
some-command | head -c 1K >somefile
打印第一个Kb数据,然后终止。管道到head
的程序将收到一个SIGPIPE - 它可以退出或继续。
现在您想要一个平台独立解决方案吗?我们可以用一小块Perl做到这一点:
perl -pe'exit if $size > 1 * 2**10; $size += length $_'
具有只会在一行末尾切断的属性。
测试(在0.01KB = 10.24字节后第一行结束后切断):
$ <<'END' perl -pe'exit if $size > 0.01 * 2**10; $size += length $_'
12345
78901
34567
END
12345
78901
$
根据输入的不同,Windows上的输出行可能会减少,因为CRLF行结尾有一个额外的字节。