Как программа журнала может продолжить работу с удаленным файлом?

Из Unix Power Tools, 3-е издание : вместо удаления файла, Empty It section:

Если активный процесс имеет открытый файл (не редкость для файлов журналов), удаление файла и создание нового не повлияет на программу ведения журнала; эти сообщения будут просто продолжать работу с файлом, который больше не связан . Опорожнение файла не нарушает связь, и поэтому он очищает файл, не затрагивая программу ведения журнала.

( акцент мой )

Я не совсем понимаю, почему программа журнала будет продолжать регистрироваться в файле удаления? Это потому, что запись дескриптора файла не удаляется из таблицы процессов?

  • Дескриптор файла, связанный с сокетом или каналом в proc
  • Захват нового результата после удаления выходного файла
  • Предотвращение активного удаления файлов в файловой системе NFS
  • Переносимость ссылок файлового дескриптора
  • Можно ли найти, у какого vim / tmux открыт мой файл?
  • Максимальное количество открытых файлов, необходимых разъяснений
  • Как один и тот же fd в разных процессах указывает на один и тот же файл?
  • Что произойдет, если скрипт cron попытается скопировать каталог одновременно с записью другого процесса?
  • 3 Solutions collect form web for “Как программа журнала может продолжить работу с удаленным файлом?”

    Когда вы удаляете файл, вы действительно удаляете ссылку на файл (в индексный дескриптор). Если у кого-то уже открыт этот файл, они могут сохранить дескриптор файла, который у них есть. Файл остается на диске, занимая место, и его можно записать и прочитать, если у вас есть доступ к нему.

    Функция unlink определяется с помощью этого поведения POSIX:

    Когда количество ссылок на файл становится равным 0, и процесс не открывается, пространство, занимаемое файлом, должно быть освобождено, и файл больше не будет доступен. Если один или несколько процессов открывают файл при удалении последней ссылки, ссылка должна быть удалена до возврата функции unlink (), но удаление содержимого файла должно быть отложено до тех пор, пока все ссылки на файл не будут закрыты .

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

    В конце концов, когда демон завершает или close файл , пространство будет освобождено. Никто не может открывать файл в среднем (за исключением системных рефлексивных интерфейсов, таких как Linux /proc/x/fd/... ). Также гарантируется, что:

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

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

    В точку.

    Файлы являются трехчастными.

    • Содержимое, то есть плоский массив байтов, записанный где-то на диске или сгенерированный «на лету».
    • Индексный узел или индекс inode для краткости, который является структурой данных, заполненной и используемой ядром. Он содержит все метаданные (размер, разрешение и т. Д.) О файле, а также указывает на местоположение содержимого файла.
    • Одна или несколько записей каталога , которые являются местоположениями, управляются как пути, например /home/user/personal_file , которые действуют как дескрипторы, через которые вы можете использовать файл, изменять его содержимое, изменять его метаданные и т. Д.

    Когда вы открываете файл, вы указываете путь к операционной системе и возвращает дескриптор непосредственно в индексный дескриптор. С помощью этого дескриптора, называемого файловым дескриптором, вы можете управлять файлом по своему усмотрению (или, по крайней мере, разрешенным ОС).

    Вы никогда не сможете напрямую удалить inode, вам нужно указать путь к ОС, чтобы потребовать удаления. Поэтому, когда вы хотите удалить файл, вы удаляете только запись в каталоге. Если файл имеет другие записи в каталоге, он будет оставаться доступным, и даже если он его не имеет, его индекс не будет удален, пока на нем будут указатели файлов. @ Ответ MichaelHomer более технический и более подробный в этой конкретной теме.

    Остальные 2 ответа хорошо объясняют проблему – файл не получает «удален» до тех пор, пока все ссылки на него каталогов и все открытые дескрипторы файла к нему не исчезнут.

    Чтобы этого избежать, это хорошая привычка использовать

     > /var/log/bigfile 

    вместо

     rm -f /var/log/bigfile 

    так как это просто сбрасывает содержимое на 0 байтов, а не удаляет его, и вы все равно можете видеть, что написано на нем.

    Если вы удалили файл и находитесь в Linux, где у вас есть файловая система / proc / fd, вы все равно можете использовать

     > /proc/12345/fd/3 

    до нуля содержимого файла (при условии, что 12345 – ваш идентификатор процесса, а 3 – номер fd большого файла). Это может быть спасателем жизни, если ваш диск работает полностью, и по какой-то причине вы не можете убить процесс, который записывает ваш файл журнала.

    Interesting Posts

    find-like tool для поиска (рекурсивно) в папках MailDir по размеру, отправителю, получателю, расширению имени вложения и т. д.

    Сравните две записи файлов, чтобы найти идентичные файлы, но игнорировать расширения

    Ошибка Startx во FreeBSD

    Использование localectl в Arch, Ошибка вызова метода: Недействительные данные локали

    Какая должна быть правильная конфигурация dhcp для создания новой сети над eth0?

    Диалог – Продолжить в фоновом режиме

    RHEL открывает конфликты

    Как установить g ++ 4.8 для установки по умолчанию после установки?

    Как удалить все, кроме последних 10 файлов

    Последовательная связь не работает в обоих направлениях

    Что означает амперсанд в «cat &» в Linux?

    Меню GRUB не видно

    Как перезапустить сеть или попросить систему запрашивать IP-адрес обновления с DHCP?

    Выход из сценария оболочки, если некоторые дочерние процессы завершаются

    Как указать программы, которые я хочу запустить при загрузке компьютера?

    Linux и Unix - лучшая ОС в мире.