Как я могу ограничить размер файла журнала, записанного с >>
200 МБ?
$ run_program >> myprogram.log
io-redirection
limit
size
Дэвид
источник
источник
Ответы:
Если ваше приложение (т.е.
run_program
) не поддерживает ограничение размера файла журнала, вы можете периодически проверять размер файла в цикле с помощью внешнего приложения или сценария.Вы также можете использовать,
logrotate(8)
чтобы вращать ваши журналы, у него естьsize
параметр, который вы можете использовать для своих целей:источник
postscript
опцию для отправки конфигурации logrotateSIGHUP
в программу.Если вашей программе не нужно записывать какие-либо ДРУГИЕ файлы, которые были бы больше этого предела, вы можете сообщить ядру об этом пределе, используя
ulimit
. Перед тем, как выполнить команду, запустите ее, чтобы установить ограничение размера файла 200 МБ для всех процессов, запущенных в текущем сеансе оболочки:Это защитит вашу систему, но это может вызвать проблемы с программой, записывающей файл. Как рекомендует eyazici , подумайте о том , чтобы настроить удаление
logrotate
файлов журнала, когда они достигнут определенного размера или возраста. Вы можете удалить старые данные или заархивировать их на некоторое время в виде ряда сжатых файлов.источник
Вы можете создать новый образ файловой системы, смонтировать его с помощью устройства loop и поместить файл журнала в эту файловую систему:
Вы также можете использовать
tmpfs
вместо файла, если у вас достаточно памяти.источник
Вы можете усечь вывод с помощью
head
:источник
SIGPIPE
), как только она достигнет предела размера, а не отбросит данные.dd
магией, но да @ Random832 прав, вы получитеSIGPIPE
ashead
/dd
/whatever
отбрасываете его.trap '' SIGPIPE
?{ head -c "$size" >> log; cat > /dev/null; }
.В пакете
apache2-utils
присутствует утилита под названиемrotatelogs
, она может быть вам полезна.Сводка:
rotatelogs [-l] [-L linkname ] [-p программа ] [-f] [-t] [-v] [-e] [-c] [-n количество файлов ] время ротации файла журнала | размер файла (B | K | M | G) [ смещение ]
Пример:
Полное руководство вы можете прочитать по этой ссылке .
источник
Я уверен, что оригинальный плакат нашел решение. Вот еще один для других, которые могут читать эту тему ...
Curtail ограничивает размер вывода программы и сохраняет последние 200 МБ вывода с помощью следующей команды:
Ссылки
ПРИМЕЧАНИЕ: я поддерживаю вышеупомянутое РЕПО. Просто делюсь решением ...
источник
Поскольку это текст, я бы написал сценарий на вашем любимом языке и направил его на это. Сделайте так, чтобы он обрабатывал файловый ввод / вывод (или сохранял все это в памяти, а затем сбрасывал его
SIGHUP
или тому подобное). Для этого вместо 200 МБ я бы подумал о «разумном» количестве строк для отслеживания.источник
syslog
иlogrotate
.Следующий скрипт должен сделать эту работу.
У него есть несколько очевидных коротких путей, но в целом он делает то, что вы просили. Это разделит журнал на куски ограниченного размера, и количество кусков также ограничено. Все можно указать с помощью аргументов командной строки. Файл журнала также указывается через командную строку.
Обратите внимание на небольшую ошибку, если вы используете ее с демоном, который разветвляется на задний план. Использование канала предотвратит переход демона в фоновый режим. В этом случае есть (вероятно, специфичный для bash) синтаксис, чтобы избежать проблемы:
Обратите внимание, что
<&0
, несмотря на внешнюю избыточность, без этого не получится.источник