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