Remoção do arquivo nohup durante a execução
-
18-09-2019 - |
Pergunta
Eu fiz o seguinte:
nohup find / &
rm nohup.out
Estranhamente, o comando de Nohup continuou a correr. Eu aguardava para que um novo arquivo fosse criado. Para minha surpresa, não havia esse arquivo. Para onde foi o stdout do comando?
Solução
Remover um arquivo no Unix faz duas coisas:
- Ele remove a entrada do diretório para ela.
- Se nenhum processo o abrir e não houver outras entradas de diretório para ele (links difíceis), ele libera o espaço.
Seu processo nohupped continuará com prazer a escrever no arquivo que costumava ser chamado nohup.out, mas agora é conhecido como nada além de um descritor de arquivo nesse processo.
Você pode até ter outro processo criar um nohup.out, ele não interferirá no primeiro.
Quando todos os links difíceis se foram e todos os processos o fecharem, o espaço do disco será recuperado.
Outras dicas
Se você excluirá o nohup.out
arquivo, o identificador será perdido e escreverá apenas para o descritor de arquivo, mas se você quiser limpar o nohup.out
arquivo então apenas execute isso
true > nohup.out
Ele excluirá o conteúdo do arquivo, mas não o arquivo.
Esse é o comportamento padrão no Unix.
Quando você removeu o arquivo, o último link no sistema de arquivos foi removido, mas o arquivo ainda estava aberto e, portanto, a saída de find
(Nesse caso) foi gravado em blocos de disco no pool de buffer do kernel e possivelmente até para o disco. Mas o arquivo não tinha nome. Quando find
Saída, nenhum processo ou arquivo (inode) referenciou o arquivo, então o espaço foi lançado. Essa é uma maneira de criar arquivos temporários que desaparecem quando um programa sai é criado - abrindo o arquivo e removendo -o. (Isso presume que você não precisa de um nome para o arquivo; claramente, se você precisar de um nome para o temporário, essa técnica não funcionará.)
cat /dev/null > nohup.out
a partir de aqui