Come recuperare spazio libero su file eliminati senza riavviare i processi di riferimento?


12

Quando i file di grandi dimensioni vengono eliminati su un server, è possibile che i file facciano ancora riferimento ai processi, quindi il file system non ha più spazio libero.

Ho provato a usare lsof , ma sembra che non abbia elencato i file eliminati. fuser -cha funzionato meglio, ma l'elenco dei processi è troppo lungo per verificarlo per ogni processo, soprattutto perché ogni processo è un processo 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

A volte capita che un file venga cancellato da un'applicazione o da un utente, ad esempio un file di registro e che questo file sia ancora referenziato da un processo che non può essere riavviato.

Esistono metodi merci per recuperare spazio su disco su file eliminati senza riavviare il processo che ha un riferimento a questo file eliminato?


per riferimento .. un modo migliore per eliminare un file aperto è copiare / dev / null nel filecp /dev/null file
Mike

@Mike cp /dev/nullè un comando nullo in quanto cpnon ha nulla da copiare, un semplice reindirizzamento è strettamente equivalente :>fileo addirittura>file
jlliagre

Risposte:


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

Trova tutti i descrittori di file aperti.

Grep cancellato.

StdError su / dev / null

Produzione:

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

Oppure puoi usare awk

find / proc / * / fd -ls 2> / dev / null | awk '/ delete / {print $ 11}';

output awk (testato su Ubuntu 12.04):

/proc/28680/fd/113

Trova e tronca tutti i file cancellati (testato su Ubh Ubuntu 12.04):

(NON FARE QUESTO SE NON SAPI COSA FACCIAI)

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

-p prompt prima di eseguire troncato

Il modo migliore è il troncamento manuale

Troncato manuale:

: > /proc/28680/fd/113

o:

> /proc/28680/fd/113

o:

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

Godere ;)


+1, ma ho anche richiesto sudo per eseguire questi comandi
79E09796

6

Ecco un semplice esempio con less:

Supponiamo di avere un file 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% /

Ora apro quel file con less(sì, è un file binario ... non importa)

$ less /tmp/my10MBfile &

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

Quindi rimuovo quel file

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

È ancora lì, ma cancellato. Guarda la quarta colonna dell'output lsof: File Descrittore numero 4 aperto per Lettura (4r)

Eseguiamo GDB!

$ gdb -p $(pidof less)

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

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

Questo è tutto!

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

I nostri 10 MB sono i benvenuti :)

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

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

Il processo è ancora in esecuzione.


2
Ok, ma per quanto tempo? molti processi terminano semplicemente se non riescono a scrivere nel loro file di registro.
collo lungo,

Logrotate non può farlo per te?
maxxvw,

logrotate invia al processo un segnale per chiudere il file di registro e aprirne uno nuovo.
collo lungo,

2

Questo comando mostrerà tutti i file eliminati ancora aperti su un sistema Solaris:

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

Puoi troncare quelli che sei sicuro di voler con questo comando:

:> /proc/p/fd/x

con p come ID processo e x il descrittore di file restituito dal primo comando.

Non preoccuparti se con alcuni programmi la dimensione riportata da lsviene ripristinata alla dimensione prima del troncamento dopo un po ', la dimensione effettiva utilizzata sul disco sarà molto più piccola in quanto il file ora è scarso.


0

Puoi provare ad andare alla /proc/<pid>/fddirectory e troncare il descrittore di file corrispondente. Diciamo fd = 3 punti al file eliminato di pid == 123:

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

hai un esempio di dove funziona questo metodo? Non riesco a trovare un modo per alterare FD da lì
maxxvw,

Sì, funziona, ma come trovare il pid del processo?
Ajjain

-2

Nessuna di queste soluzioni ha funzionato per me. Solo dopo aver usato Bleachbit come root sono stato in grado di liberare correttamente lo spazio associato ai file eliminati.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.