Найдите и удалите большие файлы, которые открыты, но были удалены

Если я прочитал таблицу данных правильно, Вам заполнили один слот, шесть ядер, которые показывают 12 процессорами, потому что они - гиперпоточность. (Кроме того,/proc/cpuinfo должен сказать Вам о процессоре и физическом идентификаторе. Две части ядра гиперпоточности имеют тот же физический идентификатор.)

Это походит на хорошее чтение по вопросу.

121
13.01.2017, 23:35
3 ответа

Если Вы не можете уничтожить свое приложение, можно усечь вместо того, чтобы удалить файл журнала для освобождения пространства. Если файл не был открыт в, добавляют режим (с 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", ....).

143
27.01.2020, 19:29
  • 1
    Существует также a truncate команда, которая делает то же самое более явно. –  Tobu 20.03.2013, 11:15
  • 2
    @dotancohen Stephane отредактировал для включения информации о том, как сделать это, когда pid не известен. –  Didi Kohen 20.03.2013, 12:48
  • 3
    @OlivierDulac, lsof вероятно, будет самым близким к портативному решению, которое можно получить для списка открытых файлов. подход отладчика для закрытия fd под ногами приложения должен быть довольно портативным также. –  Stéphane Chazelas 20.03.2013, 15:50
  • 4
    @StephaneChazelas:спасибо. я нашел способ перечислить все PIDs, которые имеют файл, открытый на каждом, делит: df -k | awk 'NR>1 { print $NF }' | xargs fuser -Vud (и затем легкий отправить сигналы преступникам вынудить их выпустить fd) –  Olivier Dulac 20.03.2013, 20:56
  • 5
    Можно также использовать lsof +L1. Из lsof страницы справочника: "Спецификация формы +L1 выберет открытые файлы, которые были несвязанными. Спецификация формы +aL1 <file_system> выберет несвязанные открытые файлы в указанной файловой системе. ". Это должно быть немного более надежно, чем захват. –  Synchro 23.10.2014, 09:26

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

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

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

1
27.01.2020, 19:29
  • 1
    Поскольку Linux поддерживает редкие файлы в большинстве файловых систем, поведение четко определено, и дисковый драйвер может действительно освободить дисковое пространство. Я протестировал его на ext3 и ext4, и это работает как Stephane, записал. банкомат –  jofel 20.03.2013, 12:14
  • 2
    , Что заставляет Вас сказать, что усечение файла не исправит предварительно выделенные блоки? Усечение предназначено для освобождения данных, я не делаю вещи, там любая неоднозначность с этим. –  Stéphane Chazelas 20.03.2013, 13:22
  • 3
    Файловая система может сохранить блоки выделенными, чтобы сэкономить время спустя (особенно, если файл все еще остается открытым), особенно когда это было достаточно большим перед усечением. По крайней мере это - то, что XFS, кажется, делает. –  peterph 20.03.2013, 14:53
  • 4
    . Я рад, что Вы обращаетесь "почему" в этом сообщении. –  dotancohen 21.03.2013, 08:09
  • 5
    Насколько я могу сказать, усечение открытых файлов действительно освобождает пространство на XFS также. Протестированный и с нормальным файлом и с файлом, выделенным с fallocate на Linux 4.9. Можно ли разъясниться под тем, какая файловая система и условие, усекающее файл, не освобождают пространство? –  Stéphane Chazelas 03.05.2017, 14:52
[

] Проверьте здесь быстрый старт: [][]lsof[] Quickstart[][

] [

]Удивительно, что никто не упомянул о файле 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
]
33
27.01.2020, 19:29

Теги

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