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

10

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

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

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

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

Короче говоря, когда я запускаю такой скрипт, как:

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

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

Скрипт может рухнуть, быть убитым или чем-то еще

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

mdrozdziel
источник

Ответы:

16

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

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

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

Эдуардо Иванец
источник
голова против стены Это не может быть проще. Спасибо!
mdrozdziel
2
Кажется, tail -c 1Gтакже работает, полезно посмотреть на хвост события. Понятно, что он сбрасывается после завершения команды.
Дашеси
Модуль для суффиксов не работает на Mac OS.
Ануми
0

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

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

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

log_maker hard fsize 1000000

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

Крис Тинг
источник
0

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

run_program | curtail -s 1G myprogram.log

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

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

Дейв Волавер
источник
0

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

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

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

Séverin
источник
tail -c 1G myLog.log> myLog.tmp mv myLog.tmp> myLog.log это убьет журнал, я думаю, вы хотели использовать >> вместо> или не так?
djdomi
Цель этой команды - переписать журнал только с последним 1G. >> должно быть для предыдущей команды: doSomething >> myLog.log; tail -c 1G myLog.log> myLog.tmp; mv myLog.tmp> myLog.log;
Северин