Por que 'my.log 2 & 1 &' faz com que o trabalho sustente o logout?

6

eu uso

myscript > my.log 2>&1 &

para executar um script e coletar sua saída - para que, quando eu sair, o script ainda esteja em execução. Eu deveria começar com myscript & - ele será terminado logo após o logout.

Mas isso é um efeito estranho: tudo o que o > my.log 2>&1 & faz é redirecionar o stderr para o stdout ...

Por que > my.log 2>&1 & faz com que o trabalho sustente o logout?

    
por Adobe 27.05.2012 / 11:15

3 respostas

8

Normalmente, se você colocar algo em segundo plano, ele continuará a ser executado mesmo depois que o shell pai sair. Na verdade, posso criar um caso de teste assim:

/bin/sh -c 'while true; do echo hi; sleep 5; done' &

e, em seguida, sair do shell e usando ps eu posso ver que ainda está em execução, para sempre, até matá-lo.

Há uma diferença entre redirecionar a saída e não: se você não redirecionar a saída e sair do shell, os descritores de arquivo stdout / stderr serão fechados e, da próxima vez que você tentar gravar nela a operação de gravação vai falhar. Se o script estiver verificando isso ou executando com a opção -e (exit on error), o script será interrompido. Compare o comportamento do acima com esta versão:

/bin/sh -c 'while true; do echo hi || exit 1; sleep 5; done' &

ou

/bin/sh -ec 'while true; do echo hi; sleep 5; done' &

Se você deixar isso em execução, saia do shell e use ps para ver que quando ele tenta executar o echo ele falhará e sairá.

Se você redirecionar a saída para um arquivo, obviamente a gravação não falhará mais e o script continuará a ser executado.

    
por 27.05.2012 / 17:13
1

O > my.log 2>&1 não tem nada a ver com isso. O% final & tem a função de executar um processo em segundo plano. A linha retornada após entrar no comando deve mostrar um número que é o process id (pid.) Você pode usar este número depois, com o comando kill , para finalizar o processo, se necessário.

Mesmo assim, no seu caso, eu executaria tudo em um screen . Você pode iniciar uma tela usando

screen -S <name>

e depois execute seu comando. Para desanexar de uma tela (retornar ao seu terminal inicial), você precisa pressionar CTRL e, em ordem, pressionar A e D . Para reativar uma tela que você digita:

screen -r <name>

Assim (executando a tarefa em uma tela), ele será executado mesmo que o usuário efetue logout / desconexão e a melhor parte é que você verá os resultados com o comando reconectar.

    
por 27.05.2012 / 12:57
0

Vamos comparar um processo imortal a um daemon. Um daemon não interrata com nenhum usuário ou terminal e morre quando o init morre (a menos que seja parado de propósito).

você pode "criar um daemon" com nohup e redirecionando para / dev / null o std.out & std.err

nohup ping google.com 2 > / dev / null > / dev / null - ISTO É IMORTAL.

    
por 27.05.2012 / 19:48