2

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

build.xml 的相关部分:

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

2 回答 2

2

假设您使用的是类似 unix 的系统,您可以使用ulimit.

并像这样调用你的脚本:

bash -c "ulimit -f <filesize> ; exec perl runServer.pl"

或者,您可以在脚本中跟踪或写入字节,并在达到特定限制时退出。修改你的脚本来做到这一点应该不难。

希望这可以帮助。

更新:鉴于可移植性要求,最好跟踪您在 perl 脚本中编写的内容。每次写入时,只需对字节求和并在达到限制时终止。这将比编写另一个 perl 脚本并通过它管道更有效和直接。此外,要在 windows 上进行管道传输,您需要cmd.exe在 unix 上调用,sh这对您的 ant 任务逻辑来说是一个复杂的问题。@amon info 很好。

于 2013-09-03T13:32:40.263 回答
0

你想要的(在 *nix 系统上)是head程序。例如

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

于 2013-09-03T14:16:08.497 回答