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

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

Ситуация заключается в том, что мы запускаем процесс, который заполняет файл журнала с потрясающей скоростью. Я знаю причину, и я могу это исправить. До тех пор я хотел бы 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 ). Или вы могли бы взломать ядро, но я бы посоветовал это сделать.

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

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

  • Как перенести файлы из определенных каталогов во вновь созданные каталоги на основе их расширения?
  • Debian 8.6 - Большой файл в корневой папке с именем EMPTY
  • Как удалить пустые строки из файла в оболочке?
  • Непоследовательные однократные и двойные щелчки в файловом менеджере GNOME / GTK
  • Каков результат запуска `chmod 7` в файле?
  • поиск содержимого файлов, упакованных в zip-файл
  • Sphinx Search shutdown down после `FATAL: accept () не удалось: Слишком много открытых файлов`
  • Почему копирование с винта скрипта с моими файлами?
  • Перенаправление вывода печати на многократные файлы в awk
  • Определите размер резервной копии за 7 дней
  • SED - поиск и замена специальными символами (#,,%)
  • Linux и Unix - лучшая ОС в мире.