Se eu iniciar um processo em segundo plano e, em seguida, sair, ele continuará sendo executado?

27

Perguntar isso depois de uma discussão prolongada com um colega de trabalho, eu realmente gostaria de um esclarecimento aqui.

Eu inicio um processo em segundo plano, adicionando " & " à linha de comando ou parando-o com CTRL-Z e continuando em segundo plano com " bg ". Então eu saio.

O que acontece?

Nós tínhamos certeza que deveria ter sido morto por um SIGHUP, mas isso não aconteceu; Ao fazer o login novamente, o processo foi executado com alegria e pstree mostrou que ele foi "adotado" por init .

Este é o comportamento esperado?

Mas, se for, qual é o propósito do comando nohup ? Parece que o processo não será morto de qualquer maneira, com ou sem ele ...

Editar 1

Mais alguns detalhes:

  • O comando foi iniciado a partir de uma sessão SSH, não do console físico.
  • O comando foi lançado sem nohup e / ou & ; Ele foi suspenso com CTRL-Z e reiniciado em background com bg .
  • A sessão ssh não caiu . Houve um logout real (comando " exit ").
  • O processo foi uma operação de cópia de arquivos scp .
  • Após o login novamente, pstree mostrou o processo sendo executado e sendo filho de init .

Editar 2

Para declarar a pergunta com mais clareza: colocar um processo em segundo plano (usando & ou bg ) fará com que ela ignore SIGHUP , assim como o comando nohup ?

Editar 3

Eu tentei enviar manualmente um SIGHUP para scp : ele saiu, então definitivamente não ignora o sinal.

Depois tentei lançá-lo novamente, colocá-lo em segundo plano e fazer logout: ele foi "adotado" por init e continuou em execução, e eu o encontrei lá quando fiz o login novamente.

Estou bastante confuso agora. Parece que nenhum SIGHUP foi enviado em todo o log off.

    
por Massimo 23.02.2010 / 22:04

6 respostas

18

Resposta encontrada.

Para o BASH, isso depende da opção huponexit shell, que pode ser visualizada e / ou configurada usando o comando shopt integrado.

Parece que esta opção está desativada por padrão, pelo menos em sistemas baseados em RedHat.

Mais informações na página do manual do BASH :

The shell exits by default upon receipt of a SIGHUP. Before exiting, an interactive shell resends the SIGHUP to all jobs, running or stopped. Stopped jobs are sent SIGCONT to ensure that they receive the SIGHUP. To prevent the shell from sending the signal to a particular job, it should be removed from the jobs table with the disown builtin (see SHELL BUILTIN COMMANDS below) or marked to not receive SIGHUP using disown -h.

If the huponexit shell option has been set with shopt, bash sends a SIGHUP to all jobs when an interactive login shell exits.

    
por 26.02.2010 / 15:01
7

Concordo com a Warner e apenas quero acrescentar que você pode evitar que o shell envie o SIGHUP com o comando "disown" embutido. A página man bash contém uma boa descrição.

    
por 24.02.2010 / 09:29
3

Você pode usar o comando nohup para ativar o comando e redirecionar a saída para um arquivo de saída nohup. Na página do manual nohup:

nohup - run a command immune to hangups, with output to a non-tty

A outra opção é usar o comando screen . O benefício de usar a tela é que você pode se reconectar ao processo mais tarde.

    
por 23.02.2010 / 23:35
2

Quando você bifurca um processo em segundo plano, ainda será o processo filho do shell que está sendo executado.

Todos os processos filhos executados sob um shell recebem um SIGHUP quando saem. O desempenho varia um pouco dependendo da situação exata, que é detalhada na folha de manual do bash. Outras granadas provavelmente têm descrições semelhantes.

O Apache e outros daemons normalmente recarregam a configuração no SIGHUP. Os utilitários do espaço do usuário geralmente morrem. O desempenho do aplicativo vinculado a sinais pode ser exclusivo para o aplicativo.

    
por 23.02.2010 / 22:37
0

Qual foi o processo? O desempenho descrito na postagem anterior 1 estava correto.

Certas funções e processos de script podem capturar sinais. enquanto loops podem fugir como um louco.

Veja:

Sessão SSH cai - O comando continua executando?

Editar 1 às 16:22

Do bash manpage:

The shell exits by default upon receipt of a SIGHUP.   Before  exiting,
an  interactive  shell  resends  the  SIGHUP  to  all  jobs, running or
topped.

Pesquisa inicial 1 está mostrando que o OpenSSH provavelmente ignora o SIGHUP, talvez mais sinais.

    
por 23.02.2010 / 22:12
-1

Se você não ativar o comando por meio de uma ferramenta como screen , quando a sessão terminar, todos os trabalhos / tarefas associados a essa sessão serão encerrados.

    
por 23.02.2010 / 22:33