GNU/Linux >> Linux Esercitazione >  >> Linux

Trovare e rimuovere file di grandi dimensioni che sono aperti ma sono stati eliminati?

Come si trovano file di grandi dimensioni che sono stati eliminati ma sono ancora aperti in un'applicazione? Come si può rimuovere un file del genere, anche se un processo lo ha aperto?

La situazione è che stiamo eseguendo un processo che sta riempiendo un file di registro a una velocità eccezionale. Conosco il motivo e posso risolverlo. Fino ad allora, vorrei ripristinare o svuotare il file di registro senza arrestare il processo.

Semplicemente facendo rm output.log rimuove solo i riferimenti al file, ma continua a occupare spazio su disco fino al termine del processo. Peggio:dopo rm Ora non ho modo di trovare dove sia il file o quanto sia grande! C'è un modo per trovare il file ed eventualmente svuotarlo, anche se è ancora aperto in un altro processo?

Mi riferisco in particolare ai sistemi operativi basati su Linux come Debian o RHEL.

Risposta accettata:

Se non riesci a terminare la tua applicazione, puoi troncare invece di eliminare il file di registro per recuperare lo spazio. Se il file non era aperto in modalità append (con O_APPEND ), quindi il file apparirà grande come prima la prossima volta che l'applicazione vi scriverà (sebbene con la parte iniziale sparsa e sembrando che contenesse byte NUL), ma lo spazio sarà stato recuperato (che non si applica a HFS+ file system su Apple OS/X che però non supportano i file sparsi).

Per troncarlo:

: > /path/to/the/file.log

Se era già stato cancellato, su Linux, puoi comunque troncarlo facendo:

: > "/proc/$pid/fd/$fd"

Dove $pid è l'id del processo che ha aperto il file e $fd un descrittore di file in cui lo ha aperto (che puoi controllare con lsof -p "$pid" .

Se non conosci il pid e stai cercando file cancellati, puoi fare:

lsof -nP | grep '(deleted)'

lsof -nP +L1 , come menzionato da @user75021 è un'opzione ancora migliore (più affidabile e più portabile) (elenca i file che hanno meno di 1 collegamento).

Oppure (su Linux):

find /proc/*/fd -ls | grep  '(deleted)'

O per trovare quelli grandi con zsh :

ls -ld /proc/*/fd/*(-.LM+1l0)

Un'alternativa, se l'applicazione è collegata dinamicamente, è allegare ad essa un debugger e fargli chiamare close(fd) seguito da un nuovo open("the-file", ....) .


Linux
  1. Ottenere tutti i file che sono stati modificati in una data specifica?

  2. Come posso usare xargs per copiare file che hanno spazi e virgolette nei loro nomi?

  3. Linux:rimuovi le estensioni di file per più file

  4. collegamento simbolico:trova tutti i file che si collegano a questo file

  5. trova e rimuovi i file con spazio usando il comando trova su Linux

Trova file di grandi dimensioni in Linux

Trova ed elimina il file più vecchio se ci sono più di X file in una directory in Linux

Come trovare file duplicati in Linux e rimuoverli

Come aprire file e cartelle come amministratore in Nautilus File Manager in Linux

trova i file che hanno un numero nel nome del file maggiore di

Rimuovere i file elencati in un file di testo