Сценарий, который я написал, что-то делает и в конце добавляет несколько строк в свой лог-файл. Я хотел бы сохранить только последние n строк (скажем, 1000 строк) файла журнала. Это можно сделать в конце скрипта следующим образом:
tail -n 1000 myscript.log > myscript.log.tmp
mv -f myscript.log.tmp myscript.log
но есть ли более чистое и элегантное решение? Возможно, выполнено с помощью одной команды?
text-processing
tail
logs
dr01
источник
источник
logrotate
это элегантное решениеОтветы:
Это возможно, но, как уже говорили другие, самый безопасный вариант - это создание нового файла, а затем перемещение этого файла для перезаписи оригинала.
Приведенный ниже метод загружает строки в BASH, поэтому в зависимости от количества строк из
tail
этого это повлияет на использование памяти локальной оболочкой для хранения содержимого строк журнала.Приведенное ниже также удаляет пустые строки, если они существуют в конце файла журнала (из-за поведения оценки BASH
"$(tail -1000 test.log)"
), поэтому не дает действительно 100% точного усечения во всех сценариях, но в зависимости от вашей ситуации может быть достаточно.источник
Утилита
sponge
предназначена как раз для этого случая. Если он установлен, то две ваши строки могут быть записаны:Обычно чтение из файла одновременно с записью в нем является ненадежным.
sponge
решает это, не записывая доmyscript.log
тех пор, покаtail
не закончит чтение и не завершит конвейер.устанавливать
Для установки
sponge
на Debian-подобную систему:Для установки
sponge
в системе RHEL / CentOS добавьте репозиторий EPEL и выполните:Документация
От
man sponge
:источник
sponge
. Очень полезно для всех тех, кто выучил трудный путь, который вы не можете сделатьsort importantfile.txt > importantfile.txt
:)определенно "хвост + мв" намного лучше! Но для GNU SED мы можем попробовать
источник
Для записи, с
ed
вами можно сделать что-то вродеЭто открывает
infile
иr
завершает выводtail -n 1000 infile
(т. Е. Вставляет этот вывод перед 1-й строкой), а затем удаляет то, что было изначально 1-й строкой, до конца файла. Замените,p
наw
для редактирования файла на месте.Имейте в виду, что
ed
решения не подходят для больших файлов.источник
Что вы можете сделать в своем скрипте - это реализовать логику ротации журналов. Сделайте всю регистрацию через функцию:
Эта функция, во-первых, делает что-то вроде:
затем он проверяет размер файла или каким-то образом решает, что файл требует ротации. В этот момент файл
logfile.1
, если он существует, удаляется, файлlogfile.0
, если он существует, переименовываетсяlogfile.1
иlogfile
переименовываетсяlogfile.0
.Решение о том, вращать ли, может быть основано на счетчике, поддерживаемом в самом скрипте. Когда он достигает 1000, он сбрасывается в ноль.
Если всегда требуется строго обрезать до 1000 строк, сценарий может подсчитать количество строк в файле журнала при запуске и соответствующим образом инициализировать счетчик (или, если число уже соответствует или превышает 1000, немедленно выполните ротацию).
Или вы можете получить размер, например, с помощью
wc -c logfile
и сделать поворот на основе превышения определенного размера. Таким образом, файл никогда не нужно сканировать, чтобы определить условие.источник
Я сделал использовать, вместо того
mv
, тоcp
команду для достижения этой цели , что вы можете иметь некоторые лога прямо на месте , где программное обеспечение работает. Может быть, в другом домашнем каталоге пользователя или в каталоге приложения, и все журналы находятся в одном месте в виде жестких ссылок. Если вы используетеmv
команду, вы теряете жесткую ссылку. Если вы используетеcp
команду вместо этого, вы сохраните эту жесткую ссылку.мой код что-то вроде:
Поэтому, если файлы находятся в одной и той же файловой системе, вы также можете предоставить пользователям несколько разных прав, а в случае
${LOGFILE_DIR}
изменения длины, как я.Если это
mv
команда, вы теряете жесткую связь между файлами, и ваш второй файл больше не связан с первым - возможно, разместите его где-нибудь еще.Если в другом месте вы не позволите кому-либо стереть файл, ваши журналы останутся вместе и будут хорошо контролироваться вашим собственным сценарием.
logrotate
может быть, лучше. Но я доволен этим решением.Не беспокойтесь "", но в моем случае есть некоторые файлы с пробелами и другими специальными буквами, и если я не делаю "" вокруг или {}, то вся партия работает неправильно.
Например, есть каталог, в котором более старые файлы автоматически архивируются в архив,
OLDFILE.zip
и все, что архивируется, также указано в файле,.zip_log
поэтому он также.zip_log
находится в этом каталоге, но в разделе «LOGFILE_DIR
У меня есть»:равный файл, так как это жесткая ссылка.
источник