#ubuntu #ssh
Что будет если подключившись к серверу по SSH закрыть терминал без команды exit?
Ответы
Ответ 1
выполняющийся процесс получит сигнал hup. что будет дальше — целиком и полностью зависит от того, что разработчики вложили в программу. по умолчанию она должна завершиться. скрипт для проверки: #!/bin/bash trap 'touch hupped; exit' hup echo $$ while :; do sleep 1; echo -n .; done сначала он выводит номер своего процесса, а затем раз в секунду выдаёт в stdout символ «точка». при получении сигнала hup создаёт в текущем каталоге файл hupped и завершает работу.Ответ 2
Если терминал завершен корректно, то посылает команду закрыть соединение ssh, дальше сигнал hup всем процессам. Если процесс терминала убить, то операционная система посылает tcp-fin пакет, возникает исключение на сервере, дальше hup. Если соединение было разорванной некорректно , например отключилась сеть, то fin не дойдёт и процесс будет выполняться какое-то время (около получаса обычно) пока соединение не разорвется по таймауту сервером. Дальше как и в других случаях hup.Ответ 3
По закрытию контролирующего терминала bash получает SIGHUP и выходит, [в интерактивном случае] пересылая сигнал всем процессам из списка её задач (job). Остановленные задачи получают также SIGCONT. Из документации bash по сигналам (что соответствует ожидаемому поведению групп процессов, создаваемых с помощью setpgid(2)) : The shell exits by default upon receipt of a SIGHUP. Before exiting, an interactive shell resends the SIGHUP to all jobs, running or stopped. Stopped jobs are sent SIGCONT to ensure that they receive the SIGHUP. To prevent the shell from sending the SIGHUP signal to a particular job, it should be removed from the jobs table with the disown builtin (see Job Control Builtins) or marked to not receive SIGHUP using disown -h. nohup позволяет игнорировать SIGHUP сигнал, disown команда позволяет исключить задачу из этого списка. systemd 230 версия изменяет поведение по умолчанию при завершении пользовательской сессии. ssh процесс на клиенте получает SIGHUP. ssh при получении сигнала восстанавливает stdin, если необходимо, пересылает сигнал proxy-команде, если есть и выходит. В сторону, обычно, при нормальном выходе bash (exit, Ctrl-D), SIGHUP не будет послан задачам, так как huponexit опция выключена по умолчанию. In which cases is SIGHUP not sent to a job when you log out? При этом на сервере могут не сразу узнать, что ssh клиент умер. Does getting disconnected from an SSH session kill your programs? Когда sshd на сервере заметит что соединение мертво, это приводит к посылке SIGHUP сигнала уже на сервере и повторяется поведение из цитаты выше.
Комментариев нет:
Отправить комментарий