Jak odzyskać wolne miejsce na usuniętych plikach bez ponownego uruchamiania procesów odwoływania się?

12

Kiedy duże pliki są usuwane na serwerze, do plików mogą nadal odwoływać się procesy, więc system plików nie ma więcej wolnego miejsca.

Próbowałem użyć lsof , ale wygląda na to, że nie wymieniono usuniętych plików. fuser -cdziałało lepiej, ale lista procesów jest po prostu zbyt długa, aby sprawdzić ją dla każdego procesu, zwłaszcza że każdy proces jest procesem 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

Czasami zdarza się, że plik jest usuwany przez aplikację lub użytkownika, np. Plik dziennika i że plik ten jest nadal wywoływany przez proces, którego nie można ponownie uruchomić.

Czy istnieją metody towarów do odzyskania miejsca na dysku na usuniętych plikach bez ponownego uruchamiania procesu zawierającego odniesienie do tego usuniętego pliku?

ujjain
źródło
w celach informacyjnych .. lepszym sposobem na usunięcie otwartego pliku jest skopiowanie / dev / null do plikucp /dev/null file
Mike
@Mike cp /dev/nulljest poleceniem zerowym, ponieważ cpnie ma nic do skopiowania, proste przekierowanie jest ściśle równoważne, :>filea nawet>file
jlliagre 23.04.2013

Odpowiedzi:

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

Znajdź wszystkie otwarte deskryptory plików.

Grep usunięty.

StdError do / dev / null

Wynik:

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

Lub możesz użyć awk

find / proc / * / fd -ls 2> / dev / null | awk '/ usunięto / {print 11 USD}';

wyjście awk (testowane w bash Ubuntu 12.04):

/proc/28680/fd/113

Znajdź i skróć wszystkie usunięte pliki (testowane w bash Ubuntu 12.04):

(NIE RÓB TO, JEŚLI NIE WIESZ, CO ROBISZ)

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

-p monit przed wykonaniem obcinania

Lepszym sposobem jest ręczne obcinanie

Obcinanie ręczne:

: > /proc/28680/fd/113

lub:

> /proc/28680/fd/113

lub:

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

Cieszyć się ;)

użytkownik3439968
źródło
+1, ale
wymagałem
6

Oto prosty przykład z less:

Załóżmy, że mamy plik 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% /

Teraz otwieram ten plik za pomocą less(tak, to plik binarny ... nieważne)

$ less /tmp/my10MBfile &

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

Następnie usuwam ten plik

$ 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% /

Nadal tam jest, ale usunięty. Spójrz na czwartą kolumnę wyjścia lsof: Deskryptor pliku numer 4 otwarty do odczytu (4r)

Uruchommy GDB!

$ gdb -p $(pidof less)

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

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

Otóż ​​to!

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

Nasze 10 MB jest mile widziane :)

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

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

Proces jest nadal uruchomiony.

maxxvw
źródło
2
Ok, ale na jak długo? wiele procesów po prostu kończy działanie, jeśli nie mogą zapisać do pliku dziennika.
longneck
Logrotate nie może tego dla ciebie zrobić?
maxxvw 24.04.13
logrotate wysyła do procesu sygnał zamknięcia pliku dziennika i otwarcia nowego.
longneck 24.04.13
2

To polecenie pokaże wszystkie usunięte pliki nadal otwarte w systemie Solaris:

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

Za pomocą tego polecenia możesz obciąć te, które na pewno chcesz:

:> /proc/p/fd/x

gdzie p jest identyfikatorem procesu, a x deskryptorem pliku zwróconym przez pierwsze polecenie.

Nie martw się, jeśli w przypadku niektórych programów rozmiar po zgłoszeniu lszostanie przywrócony do rozmiaru przed obcięciem, rzeczywisty rozmiar użyty na dysku będzie znacznie mniejszy, ponieważ plik jest teraz rzadki.

jlliagre
źródło
0

Możesz spróbować przejść do /proc/<pid>/fdkatalogu i obciąć odpowiedni deskryptor pliku. Powiedzmy, że fd = 3 punkty do usuniętego pliku pid == 123:

# echo "" >! /proc/123/fd/3
kofemann
źródło
czy masz przykład, gdzie ta metoda działa? Nie można znaleźć sposobu na zmianę FD stamtąd
maxxvw
Tak, to działa, ale jak znaleźć pid procesu?
ujjain 23.04.13
-2

Żadne z tych rozwiązań nie działało dla mnie. Dopiero po użyciu Bleachbit jako root byłem w stanie poprawnie zwolnić miejsce związane z usuniętymi plikami.

użytkownik189721
źródło