gzip
removeu o arquivo log.txt
enquanto o processo Java ainda o mantinha aberto. Removendo um arquivo, na verdade, significa remover um nome desse arquivo. (Quando um arquivo tem vários nomes, diz-se que ele tem vários links físicos .) Os dados do arquivo são excluídos apenas quando todos os nomes dos arquivos foram removidos e o arquivo não está aberto por nenhum processo. Então, depois que o arquivo desapareceu, ele ainda estava no disco; o arquivo só foi removido quando o processo Java saiu ou fechou o arquivo.
Observe que o processo Java ainda está gravando no arquivo agora excluído. Não importa se você cria um novo arquivo com o mesmo nome: esse é um arquivo diferente.
Se um arquivo não tiver mais nenhum nome, na maioria dos unices você não poderá recriar um link físico para ele, mesmo que o arquivo ainda esteja aberto. Havia um patch proposto para apresentar uma chamada de sistema flink
para fazer isso no Linux, mas foi abatido .
Você ainda pode ler o conteúdo do arquivo (convenientemente no Linux, e talvez menos convenientemente na maioria dos unices). O diretório /proc/1234/fd
em que 1234 é o PID do processo Java contém links simbólicos para os arquivos que o processo abriu. Se um desses arquivos for excluído, o link simbólico ficará pendente, mas ainda poderá ser aberto para leitura.
Isso permitirá que você extraia todas as linhas de registro do processo. Executar
tail -c +$(($(zcat log.txt.gz | wc -c) + 1)) -f </proc/1234/fd >more-log.txt
até o processo Java ter morrido.