Respostas:
O nohupcomando grava apenas nohup.outse a saída for para o terminal. Se você redirecionou a saída do comando para outro lugar - incluindo /dev/null- é para onde vai.
nohup command >/dev/null 2>&1 # doesn't create nohup.out
Se você estiver usando nohup, isso provavelmente significa que você deseja executar o comando em segundo plano, colocando outro &no final de tudo:
nohup command >/dev/null 2>&1 & # runs in background, still doesn't create nohup.out
No Linux, a execução de um trabalho com nohupfecha automaticamente sua entrada também. Em outros sistemas, principalmente no BSD e no macOS, esse não é o caso. Portanto, ao executar em segundo plano, você pode fechar a entrada manualmente. Embora o fechamento da entrada não tenha efeito na criação ou não nohup.outdela, evita outro problema: se um processo em segundo plano tentar ler algo da entrada padrão, ele será pausado, esperando que você a traga de volta ao primeiro plano e digite alguma coisa. Portanto, a versão extra segura é assim:
nohup command </dev/null >/dev/null 2>&1 & # completely detached from terminal
Observe, no entanto, que isso não impede que o comando acesse o terminal diretamente, nem o remove do grupo de processos do seu shell. Se você deseja fazer o último e está executando bash, ksh ou zsh, pode fazê-lo executando disownsem argumento como o próximo comando. Isso significa que o processo em segundo plano não está mais associado a um "trabalho" do shell e não terá nenhum sinal encaminhado a ele pelo shell. (Observe a distinção: um disownprocesso ed não recebe sinais enviados automaticamente pelo shell pai - mas sem nohupele ainda receberá um HUPsinal enviado por outros meios, como um killcomando manual . Um nohupprocesso ignorado todos e quaisquer HUPsinais, não importa como eles são enviados.)
Explicação:
Nos sistemas Unixy, toda fonte de entrada ou destino de saída tem um número associado a ele chamado "descritor de arquivo" ou "fd", abreviado. Todo programa em execução ("processo") possui seu próprio conjunto e, quando um novo processo é iniciado, ele já possui três deles abertos: "entrada padrão", que é fd 0, é aberta para leitura do processo, enquanto "saída padrão" (fd 1) e "erro padrão" (fd 2) estão abertas para gravação. Se você acabou de executar um comando em uma janela de terminal, por padrão, qualquer coisa digitada vai para a entrada padrão, enquanto a saída padrão e o erro padrão são enviados para essa janela.
Mas você pode solicitar que o shell mude para onde um ou todos esses descritores de arquivo apontam antes de iniciar o comando; isso é o que o redirecionamento ( <, <<, >, >>) e tubo ( |operadores) fazer.
O tubo é o mais simples deles ... command1 | command2organiza a saída padrão command1para alimentar diretamente a entrada padrão de command2. Esse é um arranjo muito útil que levou a um padrão de design específico nas ferramentas UNIX (e explica a existência de erro padrão, que permite que um programa envie mensagens ao usuário mesmo que sua saída esteja indo para o próximo programa no pipeline) . Mas você só pode canalizar a saída padrão para a entrada padrão; você não pode enviar outros descritores de arquivo para um canal sem fazer malabarismos.
Os operadores de redirecionamento são mais amigáveis, pois permitem especificar qual descritor de arquivo redirecionar. Então 0<infilelê a entrada padrão do arquivo chamado infile, enquanto 2>>logfileacrescenta erro padrão para o final do arquivo chamado logfile. Se você não especificar um número, insira o padrão de redirecionamento para fd 0 ( <é o mesmo que 0<), enquanto o redirecionamento de saída será o padrão para fd 1 ( >é o mesmo que 1>).
Além disso, você pode combinar os descritores de arquivos: 2>&1significa "enviar erro padrão para onde a saída padrão estiver indo". Isso significa que você obtém um único fluxo de saída que inclui a saída padrão e o erro padrão misturados, sem mais nenhuma maneira de separá-los, mas também significa que você pode incluir o erro padrão em um pipe.
Portanto, a sequência >/dev/null 2>&1significa "enviar a saída padrão para /dev/null" (que é um dispositivo especial que simplesmente joga fora o que você escreve) "e, em seguida, envia um erro padrão para onde quer que a saída padrão esteja indo" (o que nós garantimos que era /dev/null). Basicamente, "jogue fora o que esse comando gravar no descritor de arquivo".
Quando nohupdetecta que nem o erro padrão nem a saída estão conectados a um terminal, ele não se preocupa em criar nohup.out, mas assume que a saída já está redirecionada para onde o usuário deseja.
O /dev/nulldispositivo também funciona para entrada; se você executar um comando </dev/null, qualquer tentativa desse comando de ler da entrada padrão encontrará instantaneamente o final do arquivo. Observe que a sintaxe de mesclagem não terá o mesmo efeito aqui; funciona apenas para apontar um descritor de arquivo para outro aberto na mesma direção (entrada ou saída). O shell permitirá que você faça isso >/dev/null <&1, mas isso acaba criando um processo com um descritor de arquivo de entrada aberto em um fluxo de saída; portanto, em vez de apenas atingir o final do arquivo, qualquer tentativa de leitura acionará um erro fatal "descritor de arquivo inválido".
nohup"se o processo mais tarde tentar ler algo da entrada padrão, ele fará uma pausa, esperando que você o traga de volta ao primeiro plano e digite alguma coisa". parece incorreto. Em vez disso, nohup fecha a entrada padrão (o programa não poderá ler nenhuma entrada, mesmo se for executado em primeiro plano. Não for interrompido, mas receberá um código de erro ou EOF).
nohupfaz não de entrada perto padrão automaticamente. Observe que nohupnão é um shell embutido, mas um utilitário binário.
nohupé diferente para linux e BSD ou OS X?
awké diferente, sedé diferente, nohupé diferente ...
</dev/null? Veja também 0>/dev/null unix.stackexchange.com/a/266247
nohup some_command > /dev/null 2>&1&
É tudo o que você precisa fazer!
&impedirá que você precise usar ctrl-c, se isso for importante para você.
some_commandsaída, incluindo erros.
Você já tentou redirecionar todos os três fluxos de E / S:
nohup ./yourprogram > foo.out 2> foo.err < /dev/null &
>/ dev / null em vez de </ dev / null?
< /dev/nullredireciona a entrada padrão para nohup. O Linux não exige isso, mas o POSIX permite um comportamento que nohupnão pode ser executado em segundo plano se a entrada padrão estiver conectada ao terminal. Exemplos de tais sistemas são BSD e OS X.
Você pode querer usar o programa de desanexação . Você o usa como ele, nohupmas ele não produz um log de saída, a menos que você o solicite. Aqui está a página do manual:
NAME
detach - run a command after detaching from the terminal
SYNOPSIS
detach [options] [--] command [args]
Forks a new process, detaches is from the terminal, and executes com‐
mand with the specified arguments.
OPTIONS
detach recognizes a couple of options, which are discussed below. The
special option -- is used to signal that the rest of the arguments are
the command and args to be passed to it.
-e file
Connect file to the standard error of the command.
-f Run in the foreground (do not fork).
-i file
Connect file to the standard input of the command.
-o file
Connect file to the standard output of the command.
-p file
Write the pid of the detached process to file.
EXAMPLE
detach xterm
Start an xterm that will not be closed when the current shell exits.
AUTHOR
detach was written by Robbert Haarman. See http://inglorion.net/ for
contact information.
Nota: Não tenho afiliação com o autor do programa. Sou apenas um usuário satisfeito do programa.
sudo bash -c "nohup /opt/viptel/viptel_bin/log.sh $* &> /dev/null" &
Redirecionar a saída do sudo faz com que o sudo busque a senha, portanto, um mecanismo estranho é necessário para fazer essa variante.
Se você tem um shell BASH no seu mac / linux à sua frente, tente as etapas abaixo para entender praticamente o redirecionamento:
Crie um script de 2 linhas chamado zz.sh
#!/bin/bash
echo "Hello. This is a proper command"
junk_errorcommand
Atualmente, a simples execução do script envia STDOUT e STDERR para a tela.
./zz.sh
Agora comece com o redirecionamento padrão:
zz.sh > zfile.txt
No exemplo acima, "echo" (STDOUT) entra no zfile.txt. Enquanto "erro" (STDERR) é exibido na tela.
O acima é o mesmo que:
zz.sh 1> zfile.txt
Agora você pode tentar o contrário e redirecionar o "erro" STDERR para o arquivo. O comando STDOUT from "echo" vai para a tela.
zz.sh 2> zfile.txt
Combinando os dois acima, você obtém:
zz.sh 1> zfile.txt 2>&1
Explicação:
Eventualmente, você pode compactar tudo dentro do comando nohup e executá-lo em segundo plano:
nohup zz.sh 1> zfile.txt 2>&1&