Perché il mio wget non è morto dopo la perdita della connessione SSH?


13

Ho modificato il sshmio server ed eseguito wget -r -np zzz.aaa/bbb/ccce ha iniziato a funzionare. Quindi la mia connessione a Internet (a casa mia) è stata interrotta e mi sono preoccupato supponendo che wgetfosse passato hupperché la sshconnessione era andata persa e quindi il terminale era morto. Ma poi ho modificato il sshmio server e mi sono reso conto che era ancora in esecuzione, inserendo l'output wget.loge scaricando materiale. Qualcuno può spiegarmi cosa potrebbe essere successo qui?

Questo è ciò che psmi 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

Cosa significa (punto interrogativo) ?nella colonna di tty?


Si noti che su un sistema moderno in esecuzione logind, il comportamento predefinito di logindè quello di uccidere (SIGTERM) tutti i processi appartenenti a un utente quando l'utente si disconnette. Quindi questo comportamento è specifico del sistema.
Daniel Pryden,

@Dan Il mio sistema è ubuntu 16.04
yukashima huksay il

2
Credo che Ubuntu 16.04 sia un sistema systemd / logind, ma il logind.conf predefinito di Ubuntu imposta esplicitamente KillUserProcesses=no.
Daniel Pryden,

Risposte:


21

I programmi (e gli script) possono scegliere di ignorare la maggior parte dei segnali, tranne alcuni simili KILL. IlHUP segnale può essere catturato e ignorato se il software lo desidera.

Questo proviene src/main.cdalle wgetfonti (versione 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 po 'più in basso viene installato il gestore del segnale:

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

Quindi sembra che wgetnon stia ignorando il HUPsegnale, ma sceglie di continuare l'elaborazione con il suo output reindirizzato al file di registro.


Richiesto nei commenti: il significato di ?nella TTYcolonna dell'output di psnella domanda è che il wgetprocesso non è più associato a un terminale / TTY. Il TTY è andato via quando la connessione SSH è stata interrotta.


1
Penso che sarebbe utile aggiungere anche il significato di? in tty.
yukashima huksay,

Sì, l'ho imparato nel modo più duro. Non tutti i processi muoiono quando cala ssh. È bene sapere esattamente perché.
Doug

2
In alternativa, prendi l' abitudine di usare lo schermo e niente mai HUP.
Harper - Ripristina Monica il

8

Semplice : wgetnon si interrompe SIGHUP. Lo fa SIGTERMe SIGINT, comunque.

Non c'è nulla sulla manpagina, ma se hai inviato SIGHUPa un wgetprocesso, ottieni questo nel terminale:

# 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'.

1
Grazie. Penso che sia meglio se aggiungi anche il kill -HUP pidcomando per mostrare come si può inviare SIGHUPa un processo.
yukashima huksay,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.