Por que as tarefas em segundo plano iniciadas pelo meu shell são mais longas que o shell pai e os terminais de controle?

7

É comum dizer que "&" coloca o processo em execução em segundo plano, mas esse processo seria eliminado quando o terminal é fechado. Mas pelo que vejo, tudo o que enviei para o fundo continuava ativo desde que fechei o terminal. Por exemplo:

$ tail -f /var/log/messages/ &

Esse processo continuará a ser executado, mesmo que não haja outro processo no usuário que o tenha lançado e todos os terminais tenham desaparecido há muito tempo. Por que isso?

    
por Rogach 16.02.2012 / 19:20

3 respostas

8

Apenas um palpite (isso é bash specific): o documentação para a opção huponexit shell diz

If set, Bash will send SIGHUP to all jobs when an interactive login shell exits

No meu sistema, ele não parece estar definido por padrão. Você pode verificar com

shopt -p huponexit

Se a saída incluir -u , não é definida.

    
por 16.02.2012 / 19:27
5

Um processo colocado em segundo plano com '&' em vez de nohup vai morrer quando requer o terminal para entrada ou saída e descobre que não está lá. Nesse caso, tail provavelmente sairá quando algo gravar em / var / log / messages, embora possa haver algum problema de buffer que o atrasaria até que mais de uma mensagem seja gravada.

Iniciar um processo com ./foo > /dev/null 2&1 < /dev/null é aproximadamente equivalente a começar com nohup. Basicamente, tudo que o nohup faz é redirecionar qualquer entrada e saída que já não seja redirecionada do terminal.

    
por 16.02.2012 / 21:35
3

O "e" comercial & colocará o processo em segundo plano. Os descritores de arquivo (stdout, stderr, stdin) não são afetados. Na saída do shell, o shell enviará SIGHUP para tudo o que gerou, portanto, quando esse shell for fechado, o processo em segundo plano receberá SIGHUP e provavelmente terminará. Em alguns shells (bash, zsh) você pode evitar isso usando o comando disown , que irá dizer ao shell para não enviar SIGHUP no fechamento do shell, e o processo continuará rodando.

Você também pode executar o equivalente a 'background usando um e comercial' enviando SIGSTOP (geralmente Ctrl-Z no seu terminal) e, em seguida, aplicando o processo em segundo plano ( bg ).

nohup funciona ignorando o SIGHUP. Essa disposição de sinal é então passada para o processo filho que você executa. O nohup também verifica onde o stdout está indo e, se estiver indo para o terminal, ele redireciona o stdout e o stderr para um arquivo. Após a mudança na disposição do sinal e o possível redirecionamento, ele executa o processo em segundo plano.

Então, qual é a diferença?

Um processo em segundo plano não ignora SIGHUP , embora você possa dizer ao seu shell para não enviá-lo com o disown. A menos que seja evitado, nohup redireciona arquivos stdout para nohup.out, que eu geralmente odeio, se eu precisar excluir arquivos nohup.out aleatoriamente espalhados no meu disco.

Há também setsid , o que torna seu processo um líder de grupo de processos. Um líder de grupo de processos nunca obterá SIGHUP enviado para ele por qualquer shell. setsid não faz muito com stdout / stderr, e eu costumo usar setsid em vez de nohup .

    
por 16.02.2012 / 23:28