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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top