Posso redirecionar a saída para um arquivo de log e fazer o background de um processo ao mesmo tempo?

91

Posso redirecionar a saída para um arquivo de log e fazer o background de um processo ao mesmo tempo?

Em outras palavras, posso fazer algo assim?

nohup java -jar myProgram.jar 2>&1 > output.log &

Ou isso não é um comando legal? Ou preciso movê-lo manualmente para o plano de fundo da seguinte maneira:

java -jar myProgram.jar 2>$1 > output.log
jobs
[CTRL-Z]
bg 1
    
por djangofan 03.05.2013 / 01:56

4 respostas

137

Um problema com o seu primeiro comando é que você redireciona stderr para onde stdout é (se você alterou $ para um & como sugerido no comentário) e, em seguida, redirecionou o stdout para algum arquivo de log, mas isso não puxa ao longo do stderr redirecionado. Você deve fazê-lo na outra ordem, primeiro enviar stdout para onde você quer ir e, em seguida, enviar stderr para o endereço stdout está em

some_cmd > some_file 2>&1 &

e você pode jogar o & para enviá-lo para o fundo. Os trabalhos podem ser acessados com o comando jobs . jobs mostrará os trabalhos em execução e os numerará. Você poderia então falar sobre os trabalhos usando um% seguido do número como kill %1 ou mais.

Além disso, sem o & no final, você pode suspender o comando com Ctrl z , use o comando bg para colocá-lo em segundo plano e fg para trazê-lo de volta ao primeiro plano. Em combinação com o comando jobs , isso é poderoso.

para esclarecer a parte acima sobre a ordem em que você escreve os comandos. Suponha que stderr seja o endereço 1002, stdout seja o endereço 1001 e o arquivo seja 1008. O comando é lido da esquerda para a direita, então a primeira coisa que você vê na sua é 2>&1 , que move stderr para o endereço 1001, depois vê > file que move stdout para 1008, mas mantém stderr em 1001. Ele não puxa tudo apontando para 1001 e move-o para 1008, mas simplesmente faz referência ao stdout e o move para o arquivo.
Ao contrário, ele move stdout para 1008 e, em seguida, move stderr para o ponto em que stdout está apontando, 1008 também. Desta forma, ambos podem apontar para o arquivo único.

    
por 26.12.2013 / 09:04
13

Parar com <Ctrl+Z> e continuar em segundo plano com bg é equivalente a executar com & no final do comando.

Portanto, para executar em segundo plano e redirecionar a saída:

java -jar myProgram.jar 2> errorOutput.log > output.log &

Se você também precisa que este comando não morra quando você sair do terminal, então você deve usar nohup

    
por 03.05.2013 / 02:56
6
java -jar myProgram.jar &> output.log &

Observe que &> direciona stdout e stderr para output.log

    
por 08.09.2016 / 11:47
0

Em vez de usar nohup, você pode usar a tela. Você pode ver o status do programa em tempo real. você pode até registrar toda a saída em um arquivo. É útil quando você acessa o servidor via ssh, onde você fica desconectado devido à má conexão ou inatividade. Após o login, você pode continuar o trabalho de onde você saiu. consulte este e isso para conhecer em detalhes.

    
por 27.01.2017 / 07:15