Come si trovano file di grandi dimensioni che sono stati eliminati ma che sono ancora aperti in un'applicazione? Come si può rimuovere un tale file, 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 rm o svuotare il file di registro senza chiudere il processo.
Semplicemente rm output.log
rimuove solo i riferimenti al file, ma continua a occupare spazio sul disco fino al termine del processo. Peggio ancora: dopo rm
ing non ho più modo di trovare dove sia il file o quanto sia grande! C'è un modo per trovare il file e possibilmente svuotarlo, anche se è ancora aperto in un altro processo?
Mi riferisco specificamente a sistemi operativi basati su Linux come Debian o RHEL.
rm
file ed che sono ancora aperti?
lsof | grep "(deleted)"
. Quando non ci sono più processi che tengono aperto un file cancellato, il kernel libererà i blocchi di inode e disco. I processi non hanno "gestori" con cui possono essere avvisati che un file aperto, essenzialmente bloccato, è stato rimosso dal disco.
lsof | grep '(deleted)'
funziona anche su Linux. Su Linux, puoi essere avvisato della cancellazione dei file (anche i file che non hanno già alcuna voce in alcuna directory diversa da / proc / some-pid / fd) con il meccanismo di inotify (evento IN_DELETE_SELF)
somefile
e aperto in VIM, quindi l' rm
ho modificato in un altro processo bash. Poi corro lsof | grep somefile
e non è lì, anche se il file è aperto in VIM.
lsof -p <pid>
per elencare i suoi file aperti e le loro dimensioni. Il file eliminato avrà un(deleted)
accanto. Il file eliminato sarà/proc/<pid>/fd/1
probabilmente collegato . Non so come interrompere la scrittura di un processo nel suo descrittore di file senza interromperlo. Penserei che dipenderebbe dal processo.