2013-09-03 4 views
2

Я вызываю perl-процесс из муравья и перенаправляет вывод в текстовый файл. Я должен ограничить размер этого файла (он может полностью завершить процесс или просто сократить выход). Файл может стать настолько огромным, что он займет все оставшееся место на диске.Как ограничить размер выходного файла процессом perl?

Соответствующая часть build.xml:

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

ответ

2

если вы используете UNIX-подобную систему, вы можете использовать ulimit.

Позвоните сценарий как:

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

В качестве альтернативы вы можете отслеживать или письменные байты из вашего сценария и выхода при достижении определенного предела. Не стоит изменять ваш скрипт для этого.

Надеюсь, это поможет.

UPDATE: учитывая требования к переносимости, лучше всего отслеживать, что вы пишете в своем скрипте perl. При каждой записи просто суммируйте байты и завершайте их, когда достигнут предел. Это будет более эффективно и просто, чем писать другой скрипт perl и прокладывать через него. Кроме того, чтобы подключиться к окнам, вам нужно будет позвонить cmd.exe и в unix sh, что является сложностью в вашей логике задач Ant. @amon информация хороша, хотя.

+0

Я использую тот же скрипт для Linux, Windows и Solaris, поэтому он должен работать повсюду. – Paul

0

Что вы хотите (в системе * nix) - это программа head. Например.

some-command | head -c 1K >somefile 

, который печатает первую Кбайт данных, затем завершается. Программа, которая передает трубку на head, получит SIGPIPE - она ​​может выйти или продолжить.

Теперь вы хотите решение платформы independednt? Мы можем сделать это с крошечным кусочком Perl:

perl -pe'exit if $size > 1 * 2**10; $size += length $_' 

, который обладает свойством, что она будет только отрезать в конце строки.

Test (отрезать после первого конца строки после 0.01KB = 10,24 байт):

$ <<'END' perl -pe'exit if $size > 0.01 * 2**10; $size += length $_' 
12345 
78901 
34567 
END 
12345 
78901 
$ 

В зависимости от входных данных, может получить меньше выходные линии на Windows, так как CRLF строки окончания имеют один дополнительные байты.

+0

Я не уверен, как его реализовать, мои знания perl очень ограничены. Я вызываю perl-скрипт из ant и perl-скрипта сам по себе не пишет в файл - это муравей, где он пересылается в текстовый файл. Могу ли я добавить это решение в свою цель муравья, или мне нужно изменить скрипт perl для сохранения в файл и применить лимит? Это всего лишь множество сценариев perl, которые я называю таким образом, поэтому я предпочел бы иметь возможность ограничить его из муравья. – Paul

Смежные вопросы