Поиск и удаление больших файлов, открытых, но удаленных

Как найти большие файлы, которые были удалены, но все еще открыты в приложении? Как можно удалить такой файл, хотя процесс открыт?

Ситуация заключается в том, что мы запускаем процесс, который заполняет файл журнала с потрясающей скоростью. Я знаю причину, и я могу это исправить. До тех пор я хотел бы rm или очистить файл журнала, не закрывая процесс.

Просто rm output.log удаляет только ссылки на файл, но он продолжает занимать пространство на диске до тех пор, пока процесс не будет завершен. Хуже того: после rm ing я теперь не могу найти, где находится файл или насколько он большой! Есть ли способ найти файл и, возможно, его удалить, хотя он все еще открыт в другом процессе?

Я имею в виду Linux-ориентированные операционные системы, такие как Debian или RHEL.

3 Solutions collect form web for “Поиск и удаление больших файлов, открытых, но удаленных”

Если вы не можете убить приложение, вы можете усечь вместо удаления файла журнала, чтобы вернуть пространство. Если файл не был открыт в режиме добавления (с O_APPEND ), тогда файл будет казаться таким же большим, как и в следующий раз, когда приложение будет записывать на него (хотя основная часть разрежена и выглядит так, как если бы она содержала NUL байты), но пространство будет восстановлено (это не относится к файловым системам HFS + в Apple OS / X, которые не поддерживают разреженные файлы).

Чтобы усечь его:

 : > /path/to/the/file.log 

Если он уже был удален, в Linux вы все равно можете усечь его, выполнив:

 : > "/proc/$pid/fd/$fd" 

Где $pid – это идентификатор процесса процесса, в котором открыт файл, и дескриптор файла $fd одним файлом, с которым он был открыт (который вы можете проверить с помощью lsof -p "$pid" .

Если вы не знаете pid и ищете удаленные файлы, вы можете:

 lsof -nP | grep '(deleted)' 

lsof -nP +L1 , как упоминалось в @ user75021, является еще лучше (более надежным и более переносимым) вариантом (файлы списка, которые имеют менее 1 ссылку).

Или (в Linux):

 find /proc/*/fd -ls | grep '(deleted)' 

Или найти большие с zsh :

 ls -ld /proc/*/fd/*(-.LM+1l0) 

Альтернативой, если приложение динамически связано, является присоединение к нему отладчика и вызов вызова close(fd) за которым следует новый open("the-file", ....) .

Ознакомьтесь с lsof здесь: lsof

Я удивлен, что никто не упомянул файл lsof quickstart (включен в lsof). Раздел «3.a» показывает, как найти открытые, несвязанные файлы:

 lsof -a +L1 *mountpoint* 

Например:

 [root@enterprise ~]# lsof -a +L1 /tmp COMMAND PID USER FD TYPE DEVICE SIZE NLINK NODE NAME httpd 2357 apache 29u REG 253,17 3926560 0 1499 /tmp/.NSPR-AFM-3457-9820130.0 (deleted) mysqld 2588 mysql 4u REG 253,17 52 0 1495 /tmp/ibY0cXCd (deleted) mysqld 2588 mysql 5u REG 253,17 1048 0 1496 /tmp/ibOrELhG (deleted) mysqld 2588 mysql 6u REG 253,17 0 0 1497 /tmp/ibmDFAW8 (deleted) mysqld 2588 mysql 7u REG 253,17 0 0 11387 /tmp/ib2CSACB (deleted) mysqld 2588 mysql 11u REG 253,17 0 0 11388 /tmp/ibQpoZ94 (deleted) httpd 3457 root 29u REG 253,17 3926560 0 1499 /tmp/.NSPR-AFM-3457-9820130.0 (deleted) httpd 8437 apache 29u REG 253,17 3926560 0 1499 /tmp/.NSPR-AFM-3457-9820130.0 (deleted) httpd 8438 apache 29u REG 253,17 3926560 0 1499 /tmp/.NSPR-AFM-3457-9820130.0 (deleted) httpd 8439 apache 29u REG 253,17 3926560 0 1499 /tmp/.NSPR-AFM-3457-9820130.0 (deleted) httpd 8440 apache 29u REG 253,17 3926560 0 1499 /tmp/.NSPR-AFM-3457-9820130.0 (deleted) httpd 8441 apache 29u REG 253,17 3926560 0 1499 /tmp/.NSPR-AFM-3457-9820130.0 (deleted) httpd 8442 apache 29u REG 253,17 3926560 0 1499 /tmp/.NSPR-AFM-3457-9820130.0 (deleted) httpd 8443 apache 29u REG 253,17 3926560 0 1499 /tmp/.NSPR-AFM-3457-9820130.0 (deleted) httpd 8444 apache 29u REG 253,17 3926560 0 1499 /tmp/.NSPR-AFM-3457-9820130.0 (deleted) httpd 16990 apache 29u REG 253,17 3926560 0 1499 /tmp/.NSPR-AFM-3457-9820130.0 (deleted) httpd 19595 apache 29u REG 253,17 3926560 0 1499 /tmp/.NSPR-AFM-3457-9820130.0 (deleted) httpd 27495 apache 29u REG 253,17 3926560 0 1499 /tmp/.NSPR-AFM-3457-9820130.0 (deleted) httpd 28142 apache 29u REG 253,17 3926560 0 1499 /tmp/.NSPR-AFM-3457-9820130.0 (deleted) httpd 31478 apache 29u REG 253,17 3926560 0 1499 /tmp/.NSPR-AFM-3457-9820130.0 (deleted) 

В системах Red Hat, чтобы найти локальную копию файла быстрого запуска, я обычно делаю это:

 [root@enterprise ~]# locate -i quickstart |grep lsof /usr/share/doc/lsof-4.78/00QUICKSTART 

… или это:

 [root@enterprise ~]# rpm -qd lsof /usr/share/doc/lsof-4.78/00.README.FIRST /usr/share/doc/lsof-4.78/00CREDITS /usr/share/doc/lsof-4.78/00DCACHE /usr/share/doc/lsof-4.78/00DIALECTS /usr/share/doc/lsof-4.78/00DIST /usr/share/doc/lsof-4.78/00FAQ /usr/share/doc/lsof-4.78/00LSOF-L /usr/share/doc/lsof-4.78/00MANIFEST /usr/share/doc/lsof-4.78/00PORTING /usr/share/doc/lsof-4.78/00QUICKSTART /usr/share/doc/lsof-4.78/00README /usr/share/doc/lsof-4.78/00TEST /usr/share/doc/lsof-4.78/00XCONFIG /usr/share/man/man8/lsof.8.gz 

Для файлового системного драйвера фактически освобождается выделенное пространство, и это обычно происходит только после освобождения всех дескрипторов файлов, относящихся к этому файлу. Таким образом, вы не можете действительно освободить пространство, если только приложение не закроет файл. Это означает либо прекращение, либо воспроизведение с ним «бит» в отладчике (например, закрытие файла и удостоверение, что он не открывается / не записывается снова или не открывает /dev/null ). Или вы могли бы взломать ядро, но я бы посоветовал это сделать.

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

Обоснованием такого поведения является то, что ядро ​​не будет знать, что делать с запросами данных (как чтение, так и запись, но чтение на самом деле более критично), нацеленное на такой файл.

  • Как заставить дерево выводить только каталоги?
  • разрешение отклонено при выполнении двоичного кода
  • Как перенести файлы с полного раздела на один с большим количеством комнат?
  • Как определить общие файлы, открытые с помощью userid
  • Почему rm удаляет файлы только для чтения?
  • Setfattr всегда возвращает операцию не поддерживаемую
  • Загрузите копию файла, который обновляется при изменении
  • Переместить файл и сохранить владельца и режим в одной атомной операции
  • Присоединиться: два файла - но только добавить последние два столбца
  • sed in-place удаление строки на полную файловую систему?
  • Есть ли какая-либо команда Linux для создания нового файла в папке и автоматического создания этой папки, если она не существует?
  • Interesting Posts

    Воспроизведение аудио через несколько USB-устройств независимо

    Как изменить язык приложений по умолчанию на Debian?

    Как включить удаленный рабочий стол графического интерфейса?

    Переменная PS1 больше не отображает цветную подсказку bash

    xfce4-display-settings: почему нет «Пропустить влево»?

    Горячий, чтобы заставить diff проверить ссылку на символическую ссылку?

    Загрузка еще не завершена. Пожалуйста, повторите попытку позже

    -mtune = arm920t ": команда не найдена

    Почему это rm -rf, а не rmdir -rf

    Ошибка аутентификации Openvpn, вызванная неправильным временем системной даты

    Как создать каталог для каждого файла в родительском каталоге

    Как перемещать строки в файле, который содержит * в каждой строке

    Как я могу перечислить все переменные оболочки?

    GNOME не загружается, а GNOME Classic –

    Серверная сторона против рендеринга на стороне клиента Дисплей сервера

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