Почему мой 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
Юкашима Хуксей
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
Я думаю, было бы полезно, если бы вы также добавили значение? в тт.
Юкашима Хуксей
Да, научился этому нелегко. Не все процессы умирают, когда падает ssh. Хорошо знать точно, почему.
Даг
2
Альтернативно, сделайте привычку использовать экран и ничего когда-либо HUPS.
Харпер - Восстановить Монику
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процессу.
Юкашима Хуксей