Posso redirecionar a saída para um arquivo de log e colocar em segundo plano um processo ao mesmo tempo?

116

Posso redirecionar a saída para um arquivo de log e colocar em segundo plano 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, assim:

java -jar myProgram.jar 2>$1 > output.log
jobs
[CTRL-Z]
bg 1
djangofan
fonte
2
Tentaste? Que erro você recebe? Também não tenho certeza se você tem um erro de digitação ou erro no seu código. 2>$1provavelmente deveria ser 2>&1.
Patrick

Respostas:

171

Um problema com seu primeiro comando é que você redireciona o stderr para onde está o stdout (se você alterou o $ para a & conforme sugerido no comentário) e, em seguida, o redirecionou para algum arquivo de log, mas isso não puxa o stderr redirecionado . Você deve fazer isso na outra ordem, primeiro envie stdout para onde deseja que ele vá e, em seguida, envie stderr para o endereço em que stdout está

some_cmd > some_file 2>&1 &

e então você pode ativar o & on para enviá-lo para segundo plano. Os trabalhos podem ser acessados ​​com o jobscomando jobsmostrará os trabalhos em execução e os numerará. Você poderia falar sobre os trabalhos usando um% seguido do número mais kill %1ou menos.

Além disso, sem o & no final, você pode suspender o comando Ctrlz, use o bgcomando para colocá-lo em segundo plano e fgtrazê-lo de volta ao primeiro plano. Em combinação com o jobscomando, 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 lê da esquerda para a direita, então a primeira coisa que vê no seu é 2>&1que move o stderr para o endereço 1001, e depois vê o > fileque move o stdout para 1008, mas mantém o stderr em 1001. Ele não puxa tudo que aponta para 1001 e o move para 1008, mas simplesmente referencia o stdout e o move para o arquivo.
Por outro lado, ele move o stdout para 1008 e, em seguida, move o stderr para o ponto que o stdout está apontando, 1008 também. Dessa forma, ambos podem apontar para o único arquivo.

Jacob Minshall
fonte
parece que não consegue capturar o pid depois desta embora com$!
Chovy
8
Também vale a pena notar: você pode &> file.outredirecionar stdin e stdout para um arquivo de saída, o que reduz a possibilidade de um erro ao colocar 2>&1o local errado na linha de comando.
Dan
14

Parar <Ctrl+Z>e continuar em segundo plano com bgé equivalente a ser executado &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 precisar que esse comando não apague quando você sair do terminal, use nohup

RSFalcon7
fonte
Ah eu vejo. Você está dizendo que o '&' char anexado é redundante?
precisa saber é o seguinte
Apenas cito a página de manual. Desde nohup irá executar o comando no fundo de qualquer maneira, parece redundante para executar nohup-se no fundo
RSFalcon7
10
não nohup não executar o comando em segundo plano, você tem que anexar explicitamente&
jlliagre
3
Depois de mover um processo para o segundo plano bg, você pode desanexá-lo da sua sessão executando disown, o que faz com que o processo não acabe quando você fecha o terminal.
Koen.
14
java -jar myProgram.jar &> output.log &

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

Abhinav Bhatia
fonte
3
Uma explicação em uma linha tornará a resposta completa.
anaik
2
@ abhisheknaik96 executa o arquivo jar e redireciona stdin e stderr para output.log e torna o processo em segundo plano.
P Pang
2

Em vez de usar nohup, você pode usar a tela. 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 é desconectado devido à falta de conexão ou inatividade. Após o login, você pode continuar o trabalho de onde saiu. consulte isso e isso para saber em detalhes.

Mani
fonte
1

O teecomando também é bastante prevalente.

nohup java -jar myProgram.jar | tee output.log &

Trevorgrayson
fonte