De man nohup
:
If standard input is a terminal, redirect it from /dev/null. If standard output is a terminal, append output to
nohup.out
if possible,$HOME/nohup.out
otherwise. If standard error is a terminal, redirect it to standard output. To save output to FILE, usenohup COMMAND > FILE
.
(completamente revisado com base nos comentários)
Ao sair de um shell ou fechar um terminal, os processos-filhos serão enviados SIGHUP (hangup, o nome origina-se do momento em que os terminais discam para o computador UNIX) para informar que o terminal não está mais conectado. Além disso, quando o processo de shell termina, os fluxos stdin, stdout e stderr do processo filho serão fechados. Geralmente isso faz com que o processo da criança morra. Geralmente isso é bom porque evita que processos sejam executados sem usuário.
A finalidade do programa nohup
é manter o processo em execução mesmo depois que o shell termina e o terminal se desconecta. Como tal, direcionar sua saída para o terminal derrota completamente o propósito. Minha resposta original ( nohup COMMAND | cat
) não foi útil porque: quando o terminal está fechado, a saída do gato é fechada e assim o gato morre, o que quebra o tubo e envia um SIGPIPE para o processo nohup fazendo com que ele morra. Eu havia respondido a pergunta sem pensar no propósito.
Para atingir seu objetivo, execute nohup COMMAND > FILE
para selecionar o nome do arquivo para direcionar a saída. Em seguida, use tail -f FILE
para assistir a saída em um terminal.
Da mesma forma, pode-se usar a seguinte construção shell: COMMAND >FILE 2>&1 </dev/null &
para executar um comando cujos fluxos stdio não estejam conectados ao terminal e possam continuar em execução após o terminal ser fechado. Além disso, em zsh, execute o disown
embutido no shell para informar ao zsh para deixar o processo em vez de eliminá-lo quando o shell terminar.