Вопрос: Отключение сеанса SSH от ваших программ?


Итак, скажем, я отключился после сеанса SSH после того, как я начал rsync или cp или любую другую команду, которая может быть продолжена. Эта команда продолжает работать до тех пор, пока она не будет завершена после того, как я отключусь или ее просто убьют?

Всегда удивлялся этому.


70
2018-01-06 03:09


Источник


Я просто хочу добавить к сказанному выше, если вы окажетесь в ситуации, когда вам нужно поставить уже запущенный процесс в screen, пытаться reptyr, - a sad dude


Ответы:


Изменить для 2016:

Это Q & A предшествует Ошибка в systemd v230, Начиная с systemd v230, новым значением по умолчанию является уничтожение всех дочерних элементов завершающего сеанса входа, независимо от того, какие исторически обоснованные меры предосторожности были приняты для предотвращения этого. Поведение можно изменить, установив KillUserProcesses=no в /etc/systemd/logind.conf, или обойти, используя механизмы systemd для запуска демона в пользовательском пространстве. Эти механизмы выходят за рамки этого вопроса.

В приведенном ниже тексте описывается, как все традиционно работает в дизайне UNIX дольше, чем Linux.


Они будут убиты, но не обязательно немедленно. Это зависит от того, сколько времени понадобится для демон SSH, чтобы решить, что ваше соединение мертво. Ниже следует более подробное объяснение, которое поможет вам понять, как это работает.

Когда вы вошли в систему, демон SSH выделил для вас псевдотерминал и привязал его к настраиваемой оболочке входа пользователя. Это называется управляющим терминалом. Каждая программа, которую вы начинаете нормально в этот момент, независимо от того, сколько слоев в глубине оболочки, в конечном итоге проследит ее родословную до этой оболочки. Вы можете наблюдать это с помощью pstree команда.

Когда процесс демона SSH, связанный с вашим соединением, решает, что ваше соединение мертво, оно отправляет сигнал зависания (SIGHUP) в оболочку входа. Это уведомляет оболочку, что вы исчезли, и что она должна начать очистку после себя. То, что происходит на данный момент, зависит от оболочки (поиск на странице документации для «HUP»), но по большей части он начнет отправлять SIGHUP для выполнения заданий, связанных с ним перед завершением. Каждый из этих процессов, в свою очередь, будет делать все, что они настроены для получения этого сигнала. Обычно это означает завершение. Если эти рабочие места имеют собственные рабочие места, сигнал часто будет передаваться вместе.

Процессы, которые переживают зависание управляющего терминала, - это те, которые либо отключали себя от наличия терминала (процессы демона, которые вы начали внутри него), либо те, которые были вызваны с префиксом nohup команда. (т. е. «не вешайте трубку»). Демоны интерпретируют сигнал HUP по-разному; так как они не имеют управляющего терминала и автоматически не получают сигнал HUP, вместо этого он повторно используется как ручной запрос администратора для перезагрузки конфигурации. Как это ни парадоксально, это означает, что большинство админов не изучают использование «зависания» этого сигнала для не-демонов до тех пор, пока многое, намного позже. Вот почему вы читаете это!

Терминальные мультиплексоры - это обычный способ сохранить среду оболочки без изменений. Они позволяют вам отсоединиться от ваших процессов оболочки таким образом, чтобы вы могли снова подключиться к ним, независимо от того, было ли это отключение случайным или преднамеренным. tmuxа также screen являются более популярными; синтаксис для их использования выходит за рамки вашего вопроса, но они заслуживают внимания.


Было предложено уточнить, сколько времени понадобится для демон SSH, чтобы решить, что ваше соединение мертво. Это поведение, характерное для каждой реализации SSH-демона, но вы можете рассчитывать на то, что все они прекратятся, когда обе стороны сбрасывают TCP-соединение. Это произойдет быстро, если сервер попытается выполнить запись в сокет, и TCP-пакеты не будут подтверждены или медленно, если ничто не пытается записать в PTY.

В этом конкретном контексте наиболее вероятными факторами, которые могут вызвать запись, являются:

  • Процесс (обычно один на переднем плане), который пытается записать в PTY на стороне сервера. (Server-> клиент)
  • Пользователь пытается записать в PTY на стороне клиента. (Клиент-> сервер)
  • Хранилища любого рода. Обычно они не включаются по умолчанию либо клиентом, либо сервером, и, как правило, два варианта: уровень приложения и TCP (т. Е. SO_KEEPALIVE). Keepalives составляют либо сервер, либо клиент, который редко посылает пакеты на другую сторону, даже если в противном случае ничего не было бы причин для записи в сокет. Хотя это, как правило, предназначено для юбки брандмауэров, которые слишком быстро выходят из-под контроля, имеет дополнительный побочный эффект, вызывающий уведомление отправителя, когда другая сторона не реагирует гораздо быстрее.

Обычные правила для сеансов TCP применяются здесь: при прерывании связи между клиентом и сервером, но ни одна из сторон не пытается отправить пакет во время проблемы, соединение сохранится при условии, что обе стороны будут реагировать впоследствии и получать ожидаемый TCP порядковые номера.

Если одна сторона решила, что сокет мертв, эффекты обычно являются немедленными: процесс sshd отправит HUP и самозавершение (как описано ранее), или клиент уведомит пользователя об обнаруженной проблеме. Стоит отметить, что только потому, что одна сторона думает, что другая мертва, не означает, что другая была уведомлена об этом. Оставшаяся сторона соединения, как правило, остается открытой до тех пор, пока она не попытается записать ее и не выйдет из строя или не получит сброс TCP с другой стороны. (если в тот момент была доступна связь). Очистка, описанная в этом ответе, происходит только после сервер заметил.


104
2018-01-06 04:36



Я также добавлю команду «dtach» в этот список - это нечто противоположное экрану / tmux, в котором он позволяет подключать несколько терминалов к одному сеансу, а также отлично подходит для продления сеанса, хотя он не предоставить любые средства для воспроизведения недавней истории. - fluffy
dtach url находится здесь: dtach.sourceforge.net - slm
хороший информация. Я уже чувствую себя больше linuxey! - fregas
Кроме того, хотя это не является технически частью вашего ответа, вот несколько интересных мелочей: вы можете использовать kill -HUP как корень, чтобы заставить чей-то терминал повесить трубку. Вы не должны делать это без уважительной причины. Я получаю большую часть своего пробега, когда пользователи оставляют оболочки во время обслуживания, и мне нужно отключить файловую систему, чтобы их оболочка оставалась открытой. Если пользователь подключен, но навсегда простаивает, отправьте сигнал в свой процесс sshd. В противном случае, если он запущен внутри терминального мультиплексора, отправьте его в оболочку, которую вы хотите остановить. Только повесьте трубку, чтобы вы не работали! - Andrew B
@AndrewB, не могли бы вы рассказать о том, как «процесс демона SSH ... решает, что ваше соединение мертво»? И как я могу узнать, считает ли демон SSH / знает, что (которое) соединение мертво или нет? - Xiao Peng - ZenUML.com


Как говорили другие, как только вы отключитесь от ssh, все, что работает в нем, исчезло.

В виде @Michael Hampton и другие упоминали, что вы можете использовать такие инструменты, как tmux или screen для отключения / повторного подключения к терминалам без потери их содержимого (то есть дочерних процессов).

Кроме того, вы можете поместить процесс в фоновый режим с помощью амперсанда & и затем используйте команду disown чтобы отделить их от текущей оболочки.

# start a command
% sleep 5000 &
[1] 3820

# check it
% jobs
[1]+  Running                 sleep 5000 &

# disown everything
% disown -a

# check it again (gone from shell)
% jobs
%

# but it's still running on the system
% ps -eaf|grep "[s]leep"
saml      3820 23791  0 00:16 pts/1    00:00:00 sleep 5000
%

20
2018-01-06 05:27



Можно ли подключить терминальную сессию к disownпроцесс? - Fake Name
Да. См. Этот вопрос U & L для деталей: unix.stackexchange.com/questions/4034/... - slm


Нет, любые программы, все еще прикрепленные к терминалу, и не помещенные в фон с чем-то вроде nohup, будет убит.

Вот почему существуют виртуальные терминальные решения, такие как tmux и старше screen которые создают сеансы, которые продолжают работать, даже если вы отключены, и к которым вы можете подключиться позже.


10
2018-01-06 03:16