Файл ротации журнала Linux показывает неправильный размер, чем обычно

На самом деле есть несколько способов добиться одного и того же результата. Еще один способ — передать вывод команды последовательности в sed, как показано ниже

squeue -u user_name | sed '1d' | wc -l

0
12.04.2020, 15:56
1 ответ

Причина того, что файл выглядит большим в выводе ls, но маленьким в выводе du, и что в начале файла после поворота появляется пустое пространство, заключается в том, что любая программа записывает в файл журнала , а не , открывает файл для «добавления».

При ротации файла журнала с параметром copytruncate, установленным в файле конфигурации logrotate, создается копия файла, а исходный файл усекается . Когда файл усекается, его содержимое эффективно удаляется, но сам файл не удаляется.

Обычно программа открывала файл для добавления. Это означает, что каждая новая запись в журнал всегда происходит в конце файла. Когда файл усекается, это означает, что следующая строка журнала будет записана в начале файла, потому что именно там находится конец в этой точке.

Однако, если программа не не открыла файл в режиме добавления, следующая запись будет осуществляться по смещению в файле, на котором закончилась последняя запись, независимо от того, был ли файл усечен или нет..

Если файл был усечен по logrotate, это означает, что запись создает дыру в файле между началом и точкой, где происходит запись. Эта дыра заполнена нулевыми байтами, которые редактор viпоказывает как ^@.

Вот что происходит в вашем случае.

Файл с такой дырой называется «разреженным» файлом. Нулевые байты в самой дыре на самом деле не хранятся на диске, поэтому duпоказывает довольно маленький размер, но если вы прочитаете файл от начала до конца, вы прочтете 61M данных (логический размер файл, который lsпоказывает ).

Чтобы решить эту проблему, либо

  1. переписать программу, которая записывает в файл журнала, чтобы она открывала файл в режиме добавления,или
  2. приказать программе повторно открыть файл журнала, когда файл вращается (обычно это делается путем отправки программе сигнала HUPиз logrotate, но вы должны прочитать руководство по вашей программе )или
  3. перезапустить программу с logrotateпри смене бревна.
1
19.03.2021, 02:29

Теги

Похожие вопросы