Назад | Перейти на главную страницу

Простой способ ограничить размер файла (stdout) на уровне сценария оболочки?

Хорошо, с моей точки зрения, это очень практичный вариант использования.

Скажем, у меня есть простая оболочка oneliner, которая записывает вывод в файл. Это может быть что угодно, например tcpdump. Есть ли какой-нибудь общий и тривиальный способ убедиться, что выходной файл не превышает заданный размер?

За этим стоит защита от ошибочного заполнения всего доступного пространства в точке монтирования. Если я забуду о скрипте или он будет давать гигабайты данных в час, эта простая задача отладки может привести к потенциальному сбою системы.

Теперь мне известно о встроенных параметрах некоторых инструментов (например, комбинация -W / -C в tcpdump). Мне нужен очень общий отказоустойчивый.

Короче говоря - когда я запускаю сценарий вроде:

% this -is --my=very|awsome|script >> /var/tmp/output.log

Как убедиться, что output.log никогда не будет больше 1 ГБ.

Скрипт может дать сбой, быть убитым и т.д.

Решение, которое я ищу, должно быть легким и простым с использованием только инструментов, доступных в популярных дистрибутивах, таких как ubuntu / debian / fedora. В общем то широко доступное. Сложная, многострочная программа здесь не подходит, независимо от языка / технологии.

Ты можешь использовать head для этого:

command | head -c 1G > /var/tmp/output.log

Он принимает в качестве суффиксов K, M, G и т.п. (по умолчанию байты). Добавьте «B», чтобы использовать версии base 10.

Установите максимальный размер файла для пользователя, который будет использоваться только для запуска этих сценариев.

Файл /etc/security/limits ограничивает пользователя значениями «по умолчанию», если нет явных значений для конкретного пользователя. Эти пользовательские значения заменят значения по умолчанию. Имя файла может немного отличаться в зависимости от вашей ОС.

Если вашего пользователя журнала зовут log_maker, добавьте эту строку в файл:

log_maker hard fsize 1000000

Число после fsize - это максимальный размер файла в КБ.

curtail ограничивает размер вывода программы и сохраняет последние X КБ вывода с помощью следующей команды:

run_program | curtail -s 1G myprogram.log

https://github.com/Comcast/Infinite-File-Curtailer

ПРИМЕЧАНИЕ: я поддерживаю вышеуказанное репо. Просто поделитесь решением ...

Вы можете ограничить любой файл с помощью

tail -c 1G myLog.log > myLog.tmp
mv myLog.tmp > myLog.log

Запись хвоста непосредственно в тот же файл создает пустой файл. Значит, вам нужно использовать временный файл.