Como encontrar arquivos grandes que foram excluídos, mas ainda estão abertos em um aplicativo? Como remover um arquivo desse tipo, mesmo que um processo o abra?
A situação é que estamos executando um processo que está preenchendo um arquivo de log a uma taxa fantástica. Eu sei o motivo e posso corrigi-lo. Até então, eu gostaria de rm ou esvaziar o arquivo de log sem desligar o processo.
Simplesmente rm output.log
remove apenas referências ao arquivo, mas continua ocupando espaço no disco até que o processo seja finalizado. Pior: depois de rm
ing agora não tenho como descobrir onde o arquivo está ou qual o tamanho dele! Existe alguma maneira de encontrar o arquivo e possivelmente esvaziá-lo, mesmo que ainda esteja aberto em outro processo?
Refiro-me especificamente a sistemas operacionais baseados em Linux, como Debian ou RHEL.
rm
arquivos ed que ainda estão abertos?
lsof | grep "(deleted)"
. Quando não houver mais processos mantendo um arquivo excluído aberto, o kernel liberará os blocos de inode e disco. Os processos não têm "manipuladores" pelos quais eles podem ser notificados de que um arquivo aberto, essencialmente bloqueado, foi removido do disco.
lsof | grep '(deleted)'
funciona no Linux. No Linux, você pode ser notificado sobre a exclusão de arquivos (mesmo os arquivos que já não têm mais nenhuma entrada em nenhum diretório que não seja o / proc / some-pid / fd) com o mecanismo inotify (evento IN_DELETE_SELF)
somefile
e abri no VIM e rm
editei em outro processo do bash. Em seguida, corro lsof | grep somefile
e ele não está lá, mesmo que o arquivo esteja aberto no VIM.
lsof -p <pid>
listar seus arquivos abertos e seus tamanhos. O arquivo excluído terá um(deleted)
próximo a ele. O arquivo excluído será/proc/<pid>/fd/1
provavelmente vinculado . Não sei como fazer com que um processo pare de gravar no descritor de arquivo sem finalizá-lo. Eu pensaria que isso dependeria do processo.