Windows как закрыть терминал

Windows как закрыть терминал

Добрый день! Уважаемые читатели и гости 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.

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

Читайте также:  Секреты для mac os

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

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

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

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

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

Как отключить пользователя через 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, чтобы выкинуть пользователя и завершить его сессию.

Как закрыть терминал без убийства запущенной в нём команды

Иногда нужно «отвязать» программа от окна терминала, в котором она запущена. Например, вы подключились к удалённому серверу по SSH, запустили задачу, которая не является демоном, но выполнение которой требует большого времени (может быть дни и месяцы). Если вы закроете терминал или просто оборвёте SSH сессию, то запущенная программа попросту прекратит свою работу.

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

В этой статье описаны варианты, как закрыть терминал без остановки запущенной в нём программы.

Для этого есть два решения:

Давайте разберёмся, а в чём различия между

Давайте для начала взглянем, что происходит, когда команда запускается из интерактивной оболочки (подключённой к терминалу) без & (и без какого либо перенаправления). Поэтому давайте предположим, что вы напечатали просто foo (в качестве примера команды), тогда:

  • Создаётся процесс foo.
  • Процесс наследует stdin (стандартный ввод), stdout (стандартный вывод), и stderr (стандартный вывод ошибок) из оболочки. Следовательно, он также подключён к тому же терминалу.
  • Если оболочка получает SIGHUP (сигнал, посылаемый процессу для уведомления о потере соединения с управляющим терминалом пользователя), она также отправляет SIGHUP процессу (что обычно приводит к завершению процесса).
  • В противном случае оболочка ожидает (является заблокированной) пока процесс завершиться.

Теперь давайте посмотрим, что происходит, когда мы переводим процесс в фон, это делается набором foo &:

  • Создаётся запущенный процесс foo.
  • Процесс наследует stdout/stderr из оболочки (поэтому он всё ещё пишет в терминал).
  • Процесс, в принципе, также наследует stdin, но как только он пытается читать из stdin, он приостанавливается.
  • Он помещается в список фоновых задач, которыми управляет оболочка, что в частности означает:
  • Он выводиться по jobs и к нему можно получить доступ используя %n (где n – это номер задачи).
  • Его можно перевести на задачу переднего плана, используя fg, в этом случае он продолжится, будто бы вы не использовали с ним & (и если раньше он останавливался, при попытке читать стандартный ввод, теперь он может работать с чтением стандартного ввода из терминала).
  • Если оболочка получает SIGHUP, она также отправляет SIGHUP процессу. В зависимости от оболочки и возможных включённых опций оболочки при завершении оболочки она также будет отправлять процессу SIGHUP.
Читайте также:  Как синхронизировать все устройства windows

Теперь disown удаляет задачу из списка задач оболочки, следовательно все приведённые выше подпункты больше не применяются (включая отправку оболочкой процессу сигнала SIGHUPl). Тем не менее, помните, что он всё ещё подключён к терминалу, поэтому если терминал разрушен (что может случиться если это был pty, как те, которые создаются xtermor или ssh, и контролирующая программа завершена закрытием xterm или закрытием SSH-подключения), программа потерпит неудачу, как только она попытается прочитать из стандартного ввода или записать в стандартный вывод.

Что делает nohup, с одной стороны, она активно отделяет процесс от терминала:

  • Она закрывает стандартный ввод (программа будет неспособна читать любой стандартный ввод, даже если она запущена на переднем плане. Она не закрывается если не получает сообщение об ошибке или EOF).
  • Она перенаправляет стандартный вывод и стандартный вывод ошибок в файл nohup.out, поэтому программа не потерпит неудачу во время записи в стандартный вывод если терминал потерпит неудачу, то чтобы процесс не писал, это не будет потеряно.
  • Она не даёт процессу получить SIGHUP (отсюда и её имя).

Помните, что nohup не удаляет процесс из контроля задач оболочки и также не переводит его в фон (но поскольку задача nohup на переднем плане практически бесполезно, то обычно она запускается с использованием &). Например, в отличие от disown, оболочка всё ещё будет говорит вам, когда задача nohup завершена (конечно, если оболочка не закрылась раньше этого).

  • & переводит задачу в фон, это приводит к блокировке попыток читать стандартный ввод и делает так, что оболочка не ждёт завершения задачи.
  • disown удаляет процесс из контроля задач оболочки, но всё ещё оставляет её связанной с терминалом. Одним из результатов этого является то, что оболочка не отправит SIGHUP. Очевидно, что это может быть применимо только к фоновым задачам, поскольку вы не можете ввести это когда запущена работа на переднем плане.
  • nohup отсоединяет процесс от терминала, перенаправляет его вывод в nohup.out и предохраняет его от SIGHUP. Одним из эффектов (в честь которого и названа команда) является то, что процесс не получит любой отправленный NOHUP. Он абсолютно независим от контроля задач и может, в принципе, использоваться для задач на переднем плане (хотя это не особо полезно).

Если использовать вместе все три disown, nohup и &, то процесс будет запущен в фоне, удалён из контроля задач оболочки и эффективно отключён от терминала.

nohup выполняет КОМАНДУ игнорируя сигналы обрыва терминальной линии.

Возможные опции nohup:

Если стандартный ввод является терминалом, то он берётся из нечитаемого файла.

Если стандартный вывод является терминалом, то вывод добавляется в «nohup.out», если возможно, иначе в «$HOME/nohup.out».

Если стандартный поток ошибок является терминалом, то он перенаправляет в стандартный вывод. Чтобы записать вывод в ФАЙЛ, используйте «nohup КОМАНДА > ФАЙЛ».

ЗАМЕЧАНИЕ: ваша оболочка может предоставлять свою версию nohup, которая обычно перекрывает версию, описанную здесь. Пожалуйста, обращайтесь к документации по вашей оболочке, чтобы узнать, какие ключи она поддерживает.

Как закрыть командную строку: мышью, с клавиатуры, при помощи текстовой команды

Здравствуйте всем. Судя по тому, что интересуетесь тем, как закрыть командную строку, запускать её и вводить текстовые команды вы уже научились. Я решил не ограничиваться односложным ответом, а собрал сразу несколько рабочих способов закрытия cmd на сайте itswat.ru . Они работают во всех версиях Windows — с 7 по 10 и в более ранних тоже. В конце статьи заодно расскажу, как выйти из Терминала и Консоли Linux.

Читайте также:  Digidesign digi 002 driver windows 10

Свернуть окно cmd

Друзья, в моей практике частенько бывают случаи, что некоторые пользователи, говоря «закрыть», подразумевают сворачивание окна – в случае с cmd работают все те же методы, что и с любыми другими программами:

  1. Щёлкните один раз мышкой (левой кнопкой) по чёрточке в правом углу окошка (там, где красный крестик).
  2. С помощью сочетания клавиш ALT и TAB сверните текущее окошко или повторным нажатием TAB переместитесь к нужному окну. Кнопку ALT при этом нужно держать зажатой.

  1. Чтобы вмиг очутиться на Рабочем столе, то есть разом свернуть все окна, используйте любую из двух комбинаций – WIN+D или WIN+M.

Закрыть cmd

Как закрыть с помощью мыши окно командной строки, предполагаю, знают все – нужно нажать на красный прямоугольник с белым крестиком внутри, расположенный в верхнем правом углу. Есть ещё один вариант:

  1. Сделайте правый щелчок по верхней части окошка.
  2. В контекстном меню, которое появится, если вы щёлкнули там, где надо, выберите действие «Закрыть».

С клавиатуры

Всё описанное в предыдущем абзаце статьи выполняется довольно просто, но что делать, если «хвостатого помощника» нет под рукой или он сломан. Придётся обходиться без мышки. На самом деле есть куча способов осуществить закрытие cmd с помощью клавиатуры:

  1. То же контекстное меню можно вызвать сочетанием клавиш ALT+ПРОБЕЛ, а дальше с помощью стрелочки «вниз» следует спуститься к нужному действию и подтвердить его нажатием на кнопку ENTER.

  1. Или можно обратиться за помощью к Диспетчеру задач. Он запускается зажатием трёх клавиш – CTRL+ALT+DEL (DELETE).

  1. В Диспетчере во вкладке «Процессы» (перемещаться между пунктами меню и вкладками можно кнопкой TAB и стрелками), используя стрелку «вниз» спуститесь до процесса «Обработчик команд Windows» (вероятно, что в 10, 8 или 7 версиях название будет несколько отличаться, значит, ищите схожее по смыслу).

  1. Когда подсветите нужный процесс, нажмите на кнопку DEL или «Контекстное меню», изображающую список (прямоугольник с чёрточками внутри) и расположившуюся между правыми ALT и CTRL на клавиатуре.

  1. В появившемся списке команд выберите «Снять задачу».

Текстовой командой

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

  1. Наберите exit и нажмите Enter. Кстати, если ввести это же слово в конце списка других команд, то консоль закроется автоматически после выполнения установленных задач.

  1. Если предыдущий способ не сработал, что редко, но случается, тогда напечатайте taskkill /F /IM cmd.exe и также нажмите Enter.

Батником

Раз уж решил рассказать обо всех вариантах, то приведу и совсем уж замороченный способ для тех, кто не ищет лёгких путей или предпочитает все действия запечатывать в bat.файлы. Батник предварительно нужно создать:

  1. В новом текстовом документе редактора «Блокнот» (правый щелчок мыши на пустом пространстве Рабочего стола, далее, действие «Создать текстовый документ») напечатайте команду taskkill /F /IM cmd.exe.

  1. Пользуясь пунктом «Сохранить как…» из меню «Файла», сохраните документ под любым именем с расширением .bat, например, «Закрыть.bat».

Друзья, ваш батник – закрыватель cmd готов. Пользоваться им можно так:

  1. Сверните окошко командной строки одним из способов, описанных в первом параграфе данной статьи. Вы должны оказаться на Рабочем столе.
  2. Используя кнопку TAB, прыгайте по значкам, пока не оберётесь до «Закрыть.bat».
  3. Нажмите на кнопку Enter.

Linux

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

  1. Если вы находитесь в Консоли, то нажмите сочетание клавиш CTRL+ALT+F7 для возврата на Рабочий стол.
  2. Если вы хотите выйти из Терминала, находясь в графическом окружении, то наберите команду exit.

Мои методы закончились. Знаете ещё? Поделитесь с нами в комментариях. Давайте становиться умнее вместе. До свидания.

Оцените статью