Нет простого способа удалить строки из начала файла!
Даже используя sed -i
, вы создаете новый файл, как показано с помощью следующих команд (>
это мое приглашение):
> echo "Helo World" > toto
> ls -i toto
147543 toto
> sed -i -e 's/Helo/Hello/' toto
> ls -i toto
147292 toto
Обратите внимание, что номер индекса не совпадает. Это означает, что вы создаете новый файл с тем же именем, а не изменяете его на месте.
Это важно, если ваш файл журнала открыт программой во время выполнения этой операции. Если это так, вы создадите новый файл, в то время как программа, содержащая этот файл, продолжит запись в старый файл. Чтобы показать это, давайте попробуем следующее:
for f in $(seq 1 100); do date; echo $f; sleep 1; done > file1&
ln file1 file2
sleep 5
sed -i -e '1,10d' file1
ls -l file1 file2
sleep 5
ls -l file1 file2
2-й ls
покажет одинаковый размер для file1
и растущий размер для file2
. Если бы я не выполнил ln
до выполнения sed
, исходный файл продолжал бы расти, не будучи доступным через иерархию файловой системы. Это приведет к использованию пространства на диске, как показано df
но не показано как du
. Более подробную информацию можно найти здесь и здесь .
Ротация журналов - ваш друг здесь, но это не может быть сделано без помощи программы регистрации. Должен быть способ указать программе закрыть и снова открыть файл, чтобы новый файл использовался, но журнал, записанный после начала sed
и конца повторного открытия файла, может быть потерян. Если вы не хотите терять журналы, вы можете сначала скопировать файл, попросить программу открыть файл, а затем изменить скопированный файл. Это то, что logrotate
позволяет вам делать с минимальными сценариями.
Вы можете прочитать больше на эту тему здесь (apache 1.3), здесь (apache 2.4) и здесь (bind 9).