Як відновити вільний простір для видалених файлів без перезавантаження процесів посилання?


12

Коли великі файли видаляються на сервері, на файли все ще можуть посилатися процеси, тому файлова система не має більше вільного місця.

Я намагався використовувати 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

Іноді трапляється, що файл видаляється програмою або користувачем, наприклад, файл реєстрації, і цей файл все ще посилається на процес, який неможливо перезапустити.

Чи існують товари-способи відновити дисковий простір на видалених файлах без перезапуску процесу, який має посилання на цей видалений файл?


для довідки .. кращий спосіб видалити відкритий файл - скопіювати / dev / null у файлcp /dev/null file
Майк

@Mike cp /dev/null- це нульова команда, оскільки cpїї нема чого копіювати, просте перенаправлення суворо еквівалентне :>fileабо навіть>file
jlliagre

Відповіді:


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

Знайти всі відкриті дескриптори файлів.

Греп видалено.

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 '/ видалено / {print $ 11}';

вихідний вихід (тестується в баші 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

-p підказка перед виконанням скорочення

Кращим способом є ручне обрізання

Ручний скорочення:

: > /proc/28680/fd/113

або:

> /proc/28680/fd/113

або:

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

Насолоджуйтесь;)


+1, але я також вимагав судо для виконання цих команд
79E09796

6

Ось простий приклад із 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

Процес все ще триває.


2
Гаразд, але на скільки часу? багато процесів просто виходять, якщо вони не можуть записати у свій файл журналу.
longneck

Логротат не може цього зробити для вас?
maxxvw

logrotate посилає процесу сигнал, щоб закрити файл журналу та відкрити новий.
longneck

2

Ця команда покаже всі видалені файли, які все ще відкриті в системі Solaris:

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

За допомогою цієї команди можна усікати ті, які ви впевнені, що хочете:

:> /proc/p/fd/x

з p - ідентифікатор процесу та x дескриптор файлу, повернутий першою командою.

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


0

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

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

чи є у вас приклад, коли цей метод працює? Неможливо знайти спосіб змінити FD звідти
maxxvw

Так, це працює, але як знайти pid процесу?
ujjain

-2

Жодне з цих рішень не працювало для мене. Тільки після використання Bleachbit як root я зміг належним чином звільнити простір, пов’язаний із видаленими файлами.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.