Хорошо, с моей точки зрения, это очень практичный вариант использования.
Скажем, у меня есть простая оболочка 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
Запись хвоста непосредственно в тот же файл создает пустой файл. Значит, вам нужно использовать временный файл.