![Posso redirecionar a saída para um arquivo de log e colocar em segundo plano um processo ao mesmo tempo?](https://rvso.com/image/31666/Posso%20redirecionar%20a%20sa%C3%ADda%20para%20um%20arquivo%20de%20log%20e%20colocar%20em%20segundo%20plano%20um%20processo%20ao%20mesmo%20tempo%3F.png)
Posso redirecionar a saída para um arquivo de log e um processo em segundo plano 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 segundo plano, assim:
java -jar myProgram.jar 2>$1 > output.log
jobs
[CTRL-Z]
bg 1
Responder1
Um problema com seu primeiro comando é que você redireciona o stderr para onde o stdout está (se você alterou $ para um & como sugerido no comentário) e então redirecionou o stdout para algum arquivo de log, mas isso não puxa o stderr redirecionado . Você deve fazer isso na outra ordem, primeiro enviar stdout para onde deseja ir e depois enviar stderr para o endereço em que stdout está
some_cmd > some_file 2>&1 &
e então você pode ativar o & para enviá-lo para segundo plano. Os trabalhos podem ser acessados com o jobs
comando. jobs
irá mostrar os trabalhos em execução e numerá-los. Você poderia então falar sobre os empregos usando um% seguido de um número parecido kill %1
ou algo assim.
Além disso, sem o & no final você pode suspender o comando com Ctrlz, usar o bg
comando para colocá-lo em segundo plano e fg
trazê-lo de volta para o primeiro plano. Em combinação com o jobs
comando, 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 ele vê no seu é 2>&1
qual move stderr para o endereço 1001, ele então vê > file
qual move stdout para 1008, mas mantém o stderr em 1001. Ele não puxa tudo que aponta para 1001 e move para 1008, mas simplesmente faz referência ao stdout e o move para o arquivo.
Ao contrário, ele move o stdout para 1008 e, em seguida, move o stderr para o ponto para o qual o stdout está apontando, 1008 também. Dessa forma, ambos podem apontar para o arquivo único.
Responder2
java -jar myProgram.jar &> output.log &
Observe que &>
direciona stdout e stderr para output.log
Responder3
Parar <Ctrl+Z>
e continuar em segundo plano com bg
é equivalente a executar com &
no final do comando.
Então, 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 ao sair do terminal, então você deve usarnohup
Responder4
Em vez de usar nohup você pode usar screen. Você pode visualizar 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ê é desconectado devido a uma conexão ruim ou inatividade. Depois de fazer login você pode continuar o trabalho de onde saiu. referiresseeessesaber em detalhes.