Por que meu wget não morreu após a perda de conexão ssh?

13

I sshed para o meu servidor e correu wget -r -np zzz.aaa/bbb/ccce começou a trabalhar. Em seguida, minha conexão com a Internet (em minha casa) foi interrompida e fiquei preocupado ao supor que ela wgethavia sido interrompida hupporque a sshconexão foi perdida e, portanto, o terminal morreu. Mas então eu ssheditei para o meu servidor e percebi que ele ainda estava em execução, colocando a saída e fazendo o wget.logdownload de coisas. Alguém por favor pode me explicar o que pode ter acontecido aqui?

Isto é o que psme dá:

PID   %CPU %MEM    VSZ    RSS TTY     STAT START   TIME COMMAND
32283  0.6 29.4 179824 147088 ?       S    14:00   1:53 wget -r -np zzz.aaa/bbb/ccc

O que isso significa (ponto de interrogação) ?na coluna de tty?

yukashima huksay
fonte
Observe que, em um sistema moderno em execução logind, o comportamento padrão logindé matar (SIGTERM) todos os processos pertencentes a um usuário quando o usuário efetua logout. Portanto, esse comportamento é específico do sistema.
precisa saber é o seguinte
@Dan Meu sistema é ubuntu 16.04
yukashima huksay
2
Eu acredito que o Ubuntu 16.04 é um sistema systemd / logind, mas o logind.conf padrão do Ubuntu define explicitamente KillUserProcesses=no.
precisa saber é o seguinte

Respostas:

21

Programas (e scripts) podem optar por ignorar a maioria dos sinais, exceto alguns semelhantes KILL. O HUPsinal pode ser capturado e ignorado se o software desejar.

Isto é src/main.cdas wgetfontes (versão 1.19.2):

/* Hangup signal handler.  When wget receives SIGHUP or SIGUSR1, it
   will proceed operation as usual, trying to write into a log file.
   If that is impossible, the output will be turned off.  */

Um pouco mais abaixo, o manipulador de sinal está instalado:

  /* Setup the signal handler to redirect output when hangup is
     received.  */
  if (signal(SIGHUP, SIG_IGN) != SIG_IGN)
    signal(SIGHUP, redirect_output_signal);

Portanto, parece que wgetnão está ignorando o HUPsinal, mas escolhe continuar processando com sua saída redirecionada para o arquivo de log.


Solicitado nos comentários: O significado de ?na TTYcoluna da saída da pspergunta é que o wgetprocesso não está mais associado a um terminal / TTY. O TTY desapareceu quando a conexão SSH caiu.

Kusalananda
fonte
1
Eu acho que seria útil se você também adicionar o significado de? em tty.
você precisa saber é o seguinte
Sim, aprendi isso da maneira mais difícil. Nem todos os processos morrem quando o ssh cai. É bom saber exatamente o porquê.
Doug
2
Como alternativa, crie o hábito de usar a tela e nada nunca HUPs.
Harper - Restabelece Monica
8

Simples : wgetnão interrompe SIGHUP. Isso acontece SIGTERMe SIGINT, no entanto.

Não há nada na manpágina, mas se você enviou SIGHUPpara um wgetprocesso, obtém isso no terminal:

# in a different terminal while wget is running (with PID 12345)
kill -HUP 12345
# in the wget terminal
SIGHUP received.
Redirecting output to 'wget-log'.
Hauke ​​Laging
fonte
1
Obrigado. Eu acho que é melhor se você também adicionar o kill -HUP pidcomando para mostrar como alguém pode enviar SIGHUPpara um processo.
você precisa saber é o seguinte