Чому мій wget не помер після втрати з'єднання ssh?


13

Я прийшов sshдо свого сервера і побіг, wget -r -np zzz.aaa/bbb/cccі він почав працювати. Тоді мій зв’язок з Інтернетом (у мене вдома) перервався, і я хвилювався, вважаючи, що wgetце було hupпед, оскільки sshз'єднання було втрачене, і тому термінал загинув. Але тоді я sshдо свого сервера зрозумів, що він все ще працює, і вкладає вихід wget.logі завантажує речі. Може хтось, будь ласка, пояснить мені, що могло статися тут?

Це те, що psдає мені:

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

Що це означає (знак питання) ?у колонці tty?


Зауважте, що в сучасній запущеній logindсистемі поведінка за замовчуванням logind- це знищення (SIGTERM) усіх процесів, що належать користувачеві, коли користувач виходить із системи. Тож така поведінка є специфічною для системи.
Даніель Приден

@Dan Моя система - ubuntu 16.04
yukashima huksay

2
Я вважаю, що Ubuntu 16.04 - це система systemd / logind, але явно встановлюється типовий параметр Ubuntu logind.conf KillUserProcesses=no.
Даніель Приден

Відповіді:


21

Програми (та сценарії) можуть ігнорувати більшість сигналів, крім кількох подібних KILL. HUPСигнал можна зловити і ігнорувати , якщо програмне забезпечення так хоче.

Це з src/main.cз wgetджерел (версія 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.  */

Трохи далі встановлений обробник сигналу:

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

Так що , схоже wget, що не звертаючи уваги на HUPсигнал, але він вирішує продовжити обробку з виходом перенаправлений в файл журналу.


Запитано в коментарях: Сенс ?у TTYстовпці виводу з psзапитання полягає в тому, що wgetпроцес більше не асоціюється з терміналом / TTY. TTY пішов, коли з'єднання SSH знизилося.


1
Я думаю, було б корисно, якщо ви також додасте значення? в тти.
yukashima huksay

Так, навчився цьому важким шляхом. Не всі процеси гинуть, коли ssh падає. Добре точно знати, чому.
Дуг

2
По черзі, звикайте користуватися екраном і ніколи нічого HUP.
Харпер - Відновіть Моніку

8

Просто : wgetне перериває SIGHUP. Це все-таки відбувається SIGTERMі SIGINTхоча.

Там немає нічого на manсторінці , але якщо ви послали SIGHUPдо wgetпроцесу , то ви отримаєте в терміналі:

# 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
Спасибі. Я думаю, що краще, якщо ви також додасте kill -HUP pidкоманду, щоб показати, як можна відправляти SIGHUPпроцес.
yukashima huksay
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.