Назад | Перейти на главную страницу

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

Когда на сервере удаляются большие файлы, процессы могут по-прежнему ссылаться на них, поэтому в файловой системе не остается свободного места.

Я пытался использовать lsof, но похоже, что он не перечислил удаленные файлы. fuser -c работал лучше, но список процессов слишком длинный, чтобы проверять его для каждого процесса, тем более, что каждый процесс является процессом Oracle.

bash-3.2# fuser -c /var
/var:      105o   29999o   20444c    3528c   27258o    7715o    3864o    3862o    2494o   18205o   17450co   17445co   14912co   14824co   14818co   14816o   14814o    8532c    8530c    7633com    7118o    6958o    6790c    6784co    6734o    6693o    6689o    6684o    6675o    6635o    6594c    6548o    6547o    6546o    6545o    6544o    6543o    6542o    6541o    6540o    6537o    6535o    6456o    6128co    6113o     335o     245co     229o     161o       8o
bash-3.2# du -hs /proc
 139T   /proc

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

Существуют ли полезные методы для освобождения места на диске для удаленных файлов без перезапуска процесса, который ссылается на этот удаленный файл?

find /proc/*/fd -ls 2> /dev/null | grep '(deleted)'

Найдите все открытые файловые дескрипторы.

Grep удален.

StdError для / dev / null

Вывод:

160448715    0 lrwx------   1 user      user            64 Nov 29 15:34 /proc/28680/fd/113 -> /tmp/vteT3FWPX\ (deleted)

Или вы можете использовать awk

найти / proc / * / fd -ls 2> / dev / null | awk '/ удалено / {печать $ 11}';

Вывод awk (проверено в bash Ubuntu 12.04):

/proc/28680/fd/113

Найдите и обрежьте все удаленные файлы (проверено в bash Ubuntu 12.04):

(НЕ ДЕЛАЙТЕ ЭТОГО, ЕСЛИ ВЫ НЕ ЗНАЕТЕ, ЧТО ВЫ ДЕЛАЕТЕ)

find /proc/*/fd -ls 2> /dev/null | awk '/deleted/ {print $11}' | xargs -p -n 1 truncate -s 0

-п запросить перед выполнением обрезать

Лучший способ - усечение вручную

Усечение вручную:

: > /proc/28680/fd/113

или:

> /proc/28680/fd/113

или:

truncate -s 0 /proc/28680/fd/113

Наслаждаться ;)

Вот простой пример с less:

Предположим, у нас есть файл, my10MBfile:

$ dd if=/dev/zero of=/tmp/my10MBfile bs=1M count=10
10+0 enregistrements lus
10+0 enregistrements écrits
10485760 octets (10 MB) copiés, 0,0454491 s, 231 MB/s

$ ls -l /tmp/my10MBfile
-rw-r--r-- 1 max max 10485760 avril 23 22:49 /tmp/my10MBfile

$ df -m /tmp
/dev/disk/by-uuid/6835b2fd-971d-420c-ba18-3c729ec2e8a0     14637  9225       4662  67% /

Теперь я открываю этот файл с помощью less (да, это двоичный файл ... неважно)

$ less /tmp/my10MBfile &

$ lsof -p $(pidof less) | grep 10MBfile
less    29351  max    4r   REG    8,3 10485760 521464 /tmp/my10MBfile

Затем я удаляю этот файл

$ rm /tmp/my10MBfile

$ lsof -p $(pidof less) | grep 10MBfile
less    29351  max    4r   REG    8,3 10485760 521464 /tmp/my10MBfile (deleted)

$ df -m /tmp
/dev/disk/by-uuid/6835b2fd-971d-420c-ba18-3c729ec2e8a0     14637  9225       4662  67% /

Он все еще там, но удален. Посмотрите на 4-й столбец вывода lsof: Дескриптор файла номер 4 открыт для чтения (4r)

Запустим GDB!

$ gdb -p $(pidof less)

GNU gdb (GDB) 7.4.1-debian
....
Attaching to process 29351
....

(gdb) p close(4)
$1 = 0
(gdb) q

Это оно!

$ df -m /tmp
/dev/disk/by-uuid/6835b2fd-971d-420c-ba18-3c729ec2e8a0     14637  9215       4672  67% /

Мы рады приветствовать наши 10 МБ :)

$ ls /proc/29351/fd
0  1  2  3

$ ps 29351
29351 pts/0    S+     0:00 less /tmp/my10MBfile

Процесс все еще продолжается.

Эта команда покажет, что все удаленные файлы все еще открыты в системе Solaris:

find /proc/*/fd -type f -links 0

Вы можете обрезать те, которые уверены, что хотите, с помощью этой команды:

:> /proc/p/fd/x

где p - идентификатор процесса, а x - дескриптор файла, возвращаемый первой командой.

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

Вы можете попробовать пойти в /proc/<pid>/fd каталог и обрезать соответствующий файловый дескриптор. Скажем, fd = 3 указывает на удаленный файл pid == 123:

# echo "" >! /proc/123/fd/3

Ни одно из этих решений не помогло мне. Только после использования Bleachbit от имени root я смог правильно освободить место, связанное с удаленными файлами.