¿Por qué mi wget no murió después de la pérdida de conexión ssh?

13

Me sshed para mi servidor y corriendo wget -r -np zzz.aaa/bbb/cccy comenzó a trabajar. Luego, mi conexión a Internet (en mi casa) se interrumpió y me preocupé suponiendo que wgetse había interrumpido hupporque la sshconexión se había perdido y, por lo tanto, la terminal había muerto. Pero luego sshedité en mi servidor y me di cuenta de que todavía estaba ejecutándose y colocando la salida wget.logy descargando cosas. ¿Puede alguien explicarme qué pudo haber sucedido aquí?

Esto es lo psque me da:

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

¿Qué significa (signo de interrogación) ?en la columna de tty?

yukashima huksay
fuente
Tenga en cuenta que en un sistema moderno en ejecución logind, el comportamiento predeterminado de logindes matar (SIGTERM) todos los procesos que pertenecen a un usuario cuando el usuario cierra la sesión. Entonces este comportamiento es específico del sistema.
Daniel Pryden
@Dan Mi sistema es ubuntu 16.04
yukashima huksay
2
Creo que Ubuntu 16.04 es un sistema systemd / logind, pero el logind.conf predeterminado de Ubuntu se establece explícitamente KillUserProcesses=no.
Daniel Pryden

Respuestas:

21

Los programas (y los scripts) pueden elegir ignorar la mayoría de las señales, excepto algunas como KILL. La HUPseñal se puede capturar e ignorar si el software así lo desea.

Esto es src/main.cde las wgetfuentes (versión 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.  */

Un poco más abajo está instalado el controlador de señal:

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

Por lo tanto, parece que wgetno ignora la HUPseñal, pero elige continuar procesando con su salida redirigida al archivo de registro.


Solicitado en los comentarios: El significado de ?en la TTYcolumna de la salida de psla pregunta es que el wgetproceso ya no está asociado con un terminal / TTY. El TTY desapareció cuando se cortó la conexión SSH.

Kusalananda
fuente
1
Creo que sería útil si también agregas el significado de? en tty.
yukashima huksay
Sí, aprendí esto de la manera difícil. No todos los procesos mueren cuando ssh cae. Es bueno saber exactamente por qué.
Doug
2
Alternativamente, tenga el hábito de usar la pantalla y nada HUP nunca.
Harper - Restablecer Mónica
8

Simple : wgetno aborta SIGHUP. Lo hace SIGTERMy SIGINT, sin embargo.

No hay nada en la manpágina, pero si lo envió SIGHUPa un wgetproceso, lo obtiene en la 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
fuente
1
Gracias. Creo que es mejor si también agrega el kill -HUP pidcomando para mostrar cómo se puede enviar SIGHUPa un proceso.
yukashima huksay