如何从perl进程限制输出文件的大小?

时间:2013-09-03 13:27:22

标签: perl ant

我从ant调用perl进程并将输出重定向到文本文件。我必须限制该文件的大小(它可能完全失败进程或只是切断输出)。该文件可能会变得非常庞大,以至于它将占用剩余的磁盘空间。

build.xml的相关部分:

<exec dir="----" executable="perl" spawn="true">
       <env key="PERL_CAPTURE_OUTPUT" value="${logdir}/jboss.out"/>
       <arg value="runServer.pl"/>
</exec>

2 个答案:

答案 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行结尾有一个额外的字节。