Сессия терминала была прервана

Сессия терминала была прервана

Как завершить сессию пользователя на терминальном сервере

Как завершить сессию пользователя на терминальном сервере

Добрый день! Уважаемые читатели и гости IT портала Pyatilistnik.org. Вчера я вас научил определять номер и ID сеанса пользователя на RDS ферме или терминальном сервере. Там я вам рассказывал, что это нужно в случаях, когда вам необходимо завершить сессию пользователя, по ряду причин, одна из таких, это просто ее зависание. После чего человек и подключиться не может заново и не может выйти из своего сеанса. Вы как администратор, должны уметь решать проблему с зависшими RDP сессиями, ниже я покажу свои методы и алгоритмы.

Описание проблемы

Есть RDS ферма из 15 хостов подключений на Windows Server 2012 R2. Сервера на то они и сервера, что работают постоянно. Если у вас на ферме не настроены тайм ауты времени беспрерывной работы, то пользователи могут неделями или месяцами висеть в авторизованных подключениях. Логично предположить, что это не очень хорошо и ведет к различным последствиям, одно из которых, это полное зависание сеанса, при котором человек не может подключиться к терминальному серверу и видит сообщение "Работает служба профилей пользователей" или еще вариант "Не удается завершить требуемую операцию", я уже не говорю про повреждение пользовательского профиля. В результате того, что RDS брокеры видят. что пользователь уже залогинен, они не дают ему переподключиться к другому Session Host серверу, даже если вы закроете на текущем новые подключения. Пока вы не сделаете выход пользователя из системы для этой сессии, она так и будет мешать. Давайте разбираться, как это делать.

Методы завершения сессии пользователя не терминале

Существует несколько методов позволяющие выкинуть пользователя с сервера.

  • Завершить сессию пользователя (Сделать log off) вы можете из оснастки управления RDS фермой
  • Разлогинить пользователя можно и на самом терминальном сервере из диспетчера задач
  • Выход пользователя можно выполнить из утилиты командной строки rwinsta
  • Утилита командной строки log off
  • Утилита reset session
  • * Командлет Stop-TSSession

Как выкинуть пользователя из оснастки управления RDS

И так, у меня есть мой любимый, тестовый пользователь в Active Directory, по имени Барбоскин Геннадий Викторович. Предположим, что он зашел на терминальный стол и нам по причине зависания его сессии, нужно сделать ему выход. Первый метод, это использование оснастки по управлению RDS фермой, я вам рассказывал, как ее собирать. Открываем раздел с вашей коллекцией RDS фермы. В поисковом фильтре указываем логин или фамилию нужного сотрудника. В результате получаем хост, где он работает.

Щелкаем по нему правым кликом. В контекстном меню будет пункт "Выйти", это и соответствует завершению сессии (Log off). Так же есть пункт "Отключиться", если выберите его, то пользователь будет выброшен с терминального сервера, но его сессия останется на нем, данная операция равносильна тому, если пользователь просто нажал в окне с названием терминального сервера крестик.

После того, как вы выбрали пункт "Выйти", начнется корректное завершение сессии пользователя на RDS ферме. Сам пользователь увидит сообщение "Работает служба профилей пользователей" и у него закроется окно без ошибки.

Второй метод разлогинить пользователя на терминальном сервере

Второй метод, похож на первый, за исключением того, что нам необходимо залогиниться на нужный сервер, открыть оснастку "Диспетчер задач" и уже из него произвести выход пользователя. Сказано сделано, о том, как вам попадать на нужного участника RDS фермы я рассказывал. Далее щелкаем правым кликом по области пуска и из контекстного меню выбираем пункт "Диспетчер задач". Кстати, вызвать "Диспетчер задач" можно и через сочетание клавиш CTRL+SHIFT+ESC.

Находим нужного нам пользователя и щелкаем по нему правым кликом, в контекстном меню. нас будет интересовать пункт "Выйти". Выбираем его и завершаем сессию пользователя.

Использование утилиты RWINSTA

Если вы попали в ситуацию, когда графические методы не позволяют вам произвести выход пользователя из системы, а это необходимо, то вам на помощь придут утилиты из командной строки. RWINSTA — это встроенная в Windows утилита, которая позволяет сбрасывать сессии, по ID и имени сеанса. Первым делом вам нужно вычислить или ID сессии или ее имя, я вам рассказывал, о всех известных мне методах. можете ознакомиться. Я выберу утилиту qwinsta. Пишем команду:

или удаленно qwinsta /server:имя сервера | findstr barboskin.g

В моем примере имя сеанса rdp-tcp#172 и ее ID 515. Пишем команду:

И в первом и во втором случае, пользователь будет разлогинен с данного сервера. Данную команду можно запускать удаленно, со своего рабочего места, главное, чтобы были права на log off. Данный метод меня ни раз выручал в моей практике, например случай с зависшей сессией на Windows Server 2016, где вместо логина пользователя было имя (4).

Читайте также:  Что делать если выходит ошибка msvcp100 dll

Как отключить пользователя через reset session

Завершить сессию пользователя можно и с помощью утилиты командной строки Reset Session. В текущем примере у моего Барбоскина Геннадия Викторовича имя сеанса rdp-tcp#16 с его ID 11. Данную утилиту можно применять как локально на самом терминальном сервере, так и на своей рабочей станции, тут так же есть ключ /server.

Подробнее про утилиту reset session вы можете почитать на сайте Microsoft — https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/reset-session

Как отключить пользователя через logoff

Разлогинить пользовательскую учетную запись и даже зависшую, можно и через утилиту командной строки "LogOff". В данном примере у Геннадия Барбоскина имя сессии rdp-tcp#43. В командной строке от имени администратора введите:

Выход пользователя через командлет Stop-TSSession

Есть такой замечательный командлет Stop-TSSession. Посмотрим на сервере ID и имя сеанса, для этого в открытой оболочке PowerShell введите:

В итоге я вижу, что у пользователя barboskin.g SessionID 3. Далее пишем

Соглашаемся с тем, что будет производиться log off для данного пользователя. Проверяем, что сессия завершена. Можно вот таким простеньким скриптом из планировщика задач, разлогинивать сессии:

Выход пользователя через командлет Stop-TerminalSession

Данный командлет устанавливается отдельно, совместно с пакетом Pscx. Первым делом посмотрим локально или удаленно идентификаторы сессии пользователя, для которого мы хотим сделать log off. Выполняем команду:

Нужный мне ID сеанса 427. Далее воспользуемся командлетом Stop-TerminalSession, чтобы выкинуть пользователя и завершить его сессию.

По умолчанию, на терминальном сервере RDP-сессия длится до тех пор, пока пользователь ее явно не прервет. В некоторых случаях, это может привести к зависанию профиля или некоторых запущенных приложений.

Рекомендуется задавать лимит на сеансы, по достижении которого принудительно завершать терминальные сессии и выполнять выход пользователя из системы.

Настройка на терминальном сервере

Сессии можно настроить для конкретного сервера в настройках сервера терминалов. Процесс немного отличается в зависимости от версии операционной системы Windows.

Windows 2012 и выше

В диспетчере серверов переходим в службы удаленных рабочих столов:

Переходим в коллекцию, для которой хотим поменять настройки сеанса:

В свойствах коллекции кликаем по Задачи — Изменить свойства:

Переходим в раздел Сеанс и выставляем ограничения:

* где Окончание разъединенного сеанса — время, через которое для пользователей с завершенными сеансами произойдет выход из системы; Ограничение бездействующего сеанса — время, через которое сеанс перейдет в разъединенный, если пользователь в нем не работает (не проявляет никакой активности).

Windows 2008 R2 и ниже

Нажимаем ПускАдминистрированиеСлужбы удаленных рабочих столовКонфигурация узла сеансов удаленных рабочих столов:

В разделе «Подключения» дважды кликаем по RDP-Tcp:

На вкладке «Сеансы» ставим галочку Переопределить параметры пользователя и выставляем необходимые лимиты:

* где Завершение отключенного сеанса — время, по достижении которого отключенный сеанс будет завершен, а для пользователя будет выполнен выход; Ограничение бездействующего сеанса — ограничение на сеанс, в котором пользователь не работает.

Настройка через GPO

Если терминальных серверов много или необходимо централизованно задать политику ограничения сессий, можно воспользоваться групповыми политиками Active Directory.

Заходим в консоль управления политиками — создаем политику с любым понятным названием — переходим в настройку созданной политики.

Используем следующие ветки для настройки:

  • Конфигурация компьютераПолитикиАдминистративные шаблоныКомпоненты WindowsСлужбы удаленных рабочих столовУзел сеансов удаленных рабочих столовОграничение сеансов по времени
    (Computer ConfigurationPoliciesAdministrative TemplatesWindows ComponentsRemote Desktop ServicesRemote Desktop Session HostSession Time Limits)
  • Конфигурация пользователяПолитикиАдминистративные шаблоныКомпоненты WindowsСлужбы удаленных рабочих столовУзел сеансов удаленных рабочих столовОграничение сеансов по времени
    (User ConfigurationPoliciesAdministrative TemplatesWindows ComponentsRemote Desktop ServicesRemote Desktop Session HostSession Time Limits)

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

Для настройки выставляем следующие значения:

Если описать работу SSH (Secure Shell — безопасная оболочка) простыми словами, то её функция в том, что это простой способ подключиться к удалённому компьютеру от имени существующего на той системе пользователя с возможностью выполнять команды на ней. В первую очередь это относится к командам с интерфейсом командной строки, но также возможна передача и других видов трафика. В более технических терминах, когда мы подключаемся по ssh к другому пользователю на какой-либо системе и запускаем на той машине команды, то в действительности создаётся псевдо терминал и он подсоединяется к оболочке с входом (login shell) выполнившего вход пользователя.

Когда мы выходим (разлогиниваемся) из сессии, или сессия закрывается после таймаута из-за неактивности в течение определённого времени, то сигнал SIGHUP отправляется псевдо терминалу и все работы, которые были запущены в этом терминале, даже работы, которые имеют их родительские работы инициированные в псевдо терминале, также получают сигнал SIGHUP для принудительного закрытия.

Только работы, которые были настроены для игнорирования этого сигнала, переживают терминацию сессии. На системах Linux есть много способов сделать эти работы запущенными на удалённом сервере или любой машине даже после выхода пользователя и терминации сессии.

Читайте также:  Как узнать размер своего экрана на ноутбуке

Основы о процессах в Linux

Нормальные процессы

Нормальные процессы это те, у которых продолжительность жизни ограничивается сеансом. Они запускаются во время сессии как процессы переднего плана и завершаются через определённое время или когда сессия прекращается из-за выхода пользователя. Эти процессы имеют своего владельца, которым является любой валидный пользователь системы, включая root.

Осиротевшие процессы

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

Процессы демонов

Это процессы, которые намеренно сделаны осиротевшими. Процессы, которые намеренно оставлены работающими в системе, называются демонами или намеренно осиротевшими процессами. Обычно это процессы с длительным выполнением, которые после инициации были отсоединены от контролирующего терминала чтобы они могли работать в фоне, пока они не завершать их задачи или пока в них не возникнет ошибка. Родители таких процессов намеренно завершают свою работу, делая так, что дочерний процесс выполняется в фоне.

Техники для сохранения запущенной SSH сессии после отключения

Могут быть различные способы оставить ssh сессию запущенной после отключения, они описаны далее:

1. Использование команды screen для сохранения запущенных сессий SSH

screen — это текстовый менеджер окон для Linux, который позволяет пользователям управлять несколькими сессиями терминала одновременно, переключаться между сессиями, вести журнал действий в сессии для запущенных в screen сессий и даже возобновлять сессии в любой время по нашему желанию не беспокоясь о том, что произойдёт выход из сессии или терминал будет закрыт.

Сессии screen могут быть запущены и затем отсоединены от контролирующего терминала, что оставит их запущенными в фоне и затем их можно заново подсоединить в любое время и даже в любом месте (выполнив вход по SSH с другого компьютера). Всё что нужно, это запустить сессию в screen и когда вы хотите, отсоединить её от псевдо терминала (или контрольного терминала) и выйти из сессии. Когда нужно, вновь выполните вход по SSH и возобновите сессию.

После запуска команды screen, вы будете внутри новой сессии screen, в этой сессии вы можете создавать новые окна, перемещаться между окнами, блокировать окна и делать многое другое, что вы можете делать в обычном терминале:

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

Отсоединение экрана screen

Когда вы хотите отключиться от удалённой сессии, но хотите созданную вами сессию сохранить живой, то вам просто нужно отсоединить screen от терминала, чтобы у него не осталось контролирующего терминала. После этого вы можете безопасно отключиться.

Для отсоединения screen от удалённого терминала просто нажмите Ctrl+a, а затем нажмите d и вы вернётесь в терминал, в котором увидите сообщение, что Screen отсоединён. Всё готово — можно выходить из сессии (например, отключиться от SSH), а запущенный в эту сессию процесс останется работать.

Возобновление отсоединённой сессии screen

Если вы хотите возобновить отсоединённую сессию screen, которую вы оставили перед тем как отключиться, просто снова повторно залогинтесь на удалённом терминале и наберите

Предыдущая команда подходит если у вас только одна сессия screen.

Если открыто несколько сессий screen, то после опции -r нужно указать её индивидуальный идентификатор.

Следующая команда при нескольких запущенных сессиях выведет их список с идентификаторами:

Для подключения к одной из них нужно ввести команду вида:

2. Использование Tmux (мультиплексора терминалов) чтобы программа работала после отключения от SSH

Tmux — это ещё одна программ, которая создана на замену screen. В ней имеется большинство возможностей screen, а также несколько дополнительных функций, которые делают её более мощной чем screen.

Она позволяет, кроме всех других опций, которые предлагает screen, разделение экрана терминала по горизонтали и вертикали, чтобы иметь сразу несколько консолей, позволяет изменять размер этих панелей, имеется мониторинг активности сессий, поддержка скриптов используя режим командной строки и т. д. Благодаря этим функциям tmux, он имеется практически во всех дистрибутивах Unix и даже был включён в базовую систему OpenBSD.

Запуск сессии Tmux

После подключения к удалённому хосту по SSH, наберите в командной строке:

Вы откроете новую сессию с новым окном — здесь вы можете делать всё что угодно как в обычном терминале.

После выполнения ваших операций в терминале, вы можете отсоединить эту сессию от контрольного терминала, чтобы она перешла в фон, и вы смогли безопасно отключиться от SSH.

Читайте также:  Nvidia quadro k2000 2gb

Отсоединение сессии Tmux от терминала

В запущенной сессии tmux вы можете набрать:

Либо вы можете использовать сочетание клавиш, нажмите Ctrl+b, а затем нажмите d. После этого ваша текущая сессия будет отсоединена и вы вернётесь в ваш терминал, который вы можете безопасно закрыть (отключиться от SSH).

Возобновление фоновой сессии Tmux

Чтобы повторно открыть сессию, которую вы отсоединили и вернуть всё в то состояние, в котором находился терминал до того, как вы отключились от системы, просто повторно залогинтесь на удалённую машину и наберите

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

Чтобы узнать больше о tmux, о его возможностях и других командах и комбинациях клавиш, смотрите статью «Как пользоваться tmux для создания нескольких терминалов внутри одной консоли».

3. Использование команды nohup чтобы программа не закрывалась после отключения от SSH

Если вы не особо знакомы со screen или tmux вы можете использовать nohup и отправить вашу долго выполняющуюся команду в фон, чтобы вы могли продолжать работать в терминале, пока команда будет выполняться в фоне. Также при переводе команды в фон вы можете отключиться от удалённой системы, не опасаясь, что запущенная программа будет остановлена.

С командой nohup мы говорим процессу игнорировать сигнал SIGHUP который отправляется сессией ssh при её завершении, это делает команду устойчивой даже после выхода из сессии. При отключении от сессии, команда отсоединяется от контролирующего терминала и продолжает работать в фоне как процесс демона.

Выполнение команды в фоне используя nohup

Это простой сценарий в котором во время сессии SSH мы запустили команду find для поиска файлов в фоне используя nohup. При отправке работы в фон в приглашение терминала возвращается JOBID и PID процесса.

Возобновление сессии для просмотра всё ещё работающей задачи

Когда вы повторно залогинитесь, вы можете проверить статус команды, вернув её на передней план:

%JOBID — это цифра в квадратных скобках, например [1], тогда для перевода её на передней план введите:

Если программа уже завершила свою работу, то вы увидите что-то вроде:

По умолчанию программа также сохраняет свой вывод в файл nohup.out — в противном случае, после завершения программы уже не получится вернуть данные, которые вывела программа.

При переводе на передний план программа не показывает свой вывод — в этом состоянии её можно только остановить комбинацией CTRL+c.

4.Использование команды disown для сохранения запущенной сессии SSH

Другим элегантным способом позволить вашей команде или единичной задаче работать в фоне и оставаться активной даже после выхода из сессии является использование disown.

Disown удаляет работу из списка процессов работ системы, таким образом, процесс защищён от уничтожения во время отключения сеанса, поскольку он не получит SIGHUP от оболочки при выходе из системы.

Недостаток этого метода заключается в том, что его следует использовать только для заданий, которые не нуждаются в вводе из stdin (стандартного ввода) и не нуждаются в записи в stdout (стандартный вывод), если только вы не перенаправите ввод и вывод заданий, потому что, когда задание будет пытаться взаимодействовать со стандартным вводом или стандартным выводом, процесс остановится.

Выполнение команды с использованием disown в фоновом режиме

Ниже мы отправили команду ping в фоновый режим, чтобы она продолжала работать и была удалена из списка заданий. Как видно, задание было сначала приостановлено, после чего оно все ещё оставалось в списке заданий с идентификатором процесса: 4910.

После этого работе был передан сигнал disown и она была удалена из списка работ, хотя ещё и запущена в фоне. Работа должна ещё быть запущена, когда вы повторно зайдёте на удалённый сервер:

5. Использование команды setsid для поддержания сессии SSH в запущенном состоянии

Другой утилитой для достижения требуемого поведения является setsid. Nohup имеет недостаток в том смысле, что группа процессов процесса остаётся неизменной, поэтому процесс, запущенный с помощью nohup, уязвим для любого сигнала, отправляемого всей группе процессов (например, Ctrl+C).

С другой стороны, setsid распределяет новую группу процессов для выполняемого процесса, и, следовательно, созданный процесс полностью находится во вновь выделенной группе процессов и может безопасно выполняться, не опасаясь быть уничтоженным даже после выхода из сеанса.

Выполните любую команду, используя setsid

Здесь это показывает, что процесс ‘sleep 10m‘ был отсоединён от управляющего терминала с момента его создания.

Теперь, когда вы повторно войдете в сеанс, вы все равно обнаружите, что этот процесс запущен.

Заключение

Если вы знаете другие способы, как сделать так, чтобы процесс продолжал работать даже после отключения от SSH (закрытия терминала), то обязательно укажите их в комментариях.

Ссылка на основную публикацию
Самый лучший телефон по всем характеристикам
2018 год удивил пользователей широким выбором: здесь и Samsung Galaxy S9, и iPhone Xs, и более приемлемый Huawei Mate 20....
Регистр сведений соответствие объектов информационных баз
Логично ожидать, что при синхронизации данных, как начальной, так и основанной на регулярной основе, одинаковые данные в приложениях будут сопоставлены...
Регистрация gmail com без номера телефона
Google – передовой поисковый сервис, давно изменивший способ взаимодействия с интернетом. Именно здесь впервые ввели поиск по картинкам, предусмотрели голосовое...
Самый лучший смартфон xiaomi 2018
Собрали всё лучшее. Была идея выпустить гид по всему модельному ряду, но это обречённая затея, потому что у Xiaomi куча...
Adblock detector