O que determina exatamente se um trabalho em segundo plano é eliminado quando o shell é encerrado ou é eliminado?

12

Esta questão surgiu bastante a lot ( realmente muito ) , mas estou achando as respostas geralmente incompletas. A pergunta geral é "Por que o meu trabalho não mata quando eu mando o ssh?", E aqui está o que eu encontrei. A primeira pergunta é: Quão geral é a seguinte informação? O seguinte parece ser verdade para o moderno Debian Linux, mas estou perdendo alguns bits; e o que os outros precisam saber?

  1. Todos os processos filhos, com ou sem shell, abertos em uma conexão ssh são eliminados com SIGHUP quando a conexão ssh é fechada somente se a opção huponexit estiver definida: run shopt huponexit para ver se isso é verdade.

  2. Se huponexit for verdadeiro, você poderá usar nohup ou disown para dissociar o processo do shell para que ele não seja morto quando você sair. Ou execute as coisas com screen .

  3. Se huponexit for falso, qual é o padrão em pelo menos alguns linuxes atualmente, os trabalhos em segundo plano não serão eliminados no logout normal.

  4. Mas mesmo se huponexit for falso, se a conexão ssh for eliminada ou desativada (diferente do logout normal), os processos em segundo plano serão ainda ser morto. Isso pode ser evitado por disown ou nohup como em (2).

  5. Há alguma distinção entre (a) processos cujo processo pai é o terminal e (b) processos que possuem stdin, stdout ou stderr . Eu não sei o que acontece com processos que são (a) e não (b), ou vice-versa.

Pergunta final: Como posso evitar o comportamento (3)? Em outras palavras, por padrão, os processos em segundo plano do Debian são executados alegremente por eles mesmos após o logout, mas não após a conexão ssh ser eliminada. Eu gostaria que a mesma coisa acontecesse aos processos, independentemente de a conexão ter sido fechada normalmente ou ser morta. Ou isso é uma má ideia?

Editar: Outra maneira importante de manter os trabalhos sendo mortos, que funciona (?) em ambos os casos, é executá-los através de tela . Mas, a questão é mais sobre entender quando as coisas são mortas e quando não são: às vezes as pessoas querem que os trabalhos sejam mortos no logout, por exemplo.

Mais tópicos: - Esclarecimento de sinais (sighup), jobs e o terminal de controle - link - Continue tarefa em segundo plano do SSH / jobs ao fechar o SSH - Será um trabalho colocar em segundo plano continuar correndo depois que uma sessão SSH é fechada? - Impede que um processo em segundo plano já esteja em execução sendo interrompido após fechar o cliente SSH - Como posso iniciar um processo através de SSH de forma que ele continue a ser executado depois que eu desconectar? - Não é possível manter o trabalho remoto em execução no OS X - Feche a conexão SSH

    
por petrelharp 19.10.2013 / 22:09

1 resposta

2

Os pontos 1-4 estão corretos. Eu não sei nada sobre o ponto 5. Quanto ao seu ponto final, uma boa aplicação, tela , permitirá que você deixe todos os processos chegarem ao seu fim natural, independentemente de como você termina sua conexão. A tela está nos repos.

A descrição do homem da tela não é fácil de ler, mas, entre outras coisas, afirma:

When screen is called, it creates a single window with a shell in it (or the specified command) and then gets out of your way so that you can use the program as you normally would. Then, at any time, you can create new (full-screen) windows with other programs in them (including more shells), kill existing windows, view a list of windows, turn output logging on and off, copy-and-paste text between windows, view the scrollback history, switch between windows in whatever manner you wish, etc. All windows run their programs completely indepen‐ dent of each other. Programs continue to run when their window is currently not visible and even when the whole screen session is detached from the user's terminal. When a program terminates, screen (per default) kills the window that contained it. If this window was in the foreground, the display switches to the previ‐ ous window; if none are left, screen exits.

Eu destaquei a parte mais importante: você pode desanexar a janela com o comando Ctrl + a + d, e então você pode matar / sair da sua sessão, e a janela agora separada continuará a viver, com os programas dentro dela ainda correndo. Quando você se conecta de volta, por exemplo, iniciando uma nova sessão ssh, o comando screen -r retomará a sessão de tela que havia sido desanexada anteriormente, com toda a saída para erro / saída padrão claramente visível.

    
por 19.10.2013 / 23:51