Как завершить зависшую SSH‑сессию и перейти на Mosh

Почему SSH-сессии зависают
Чаще всего SSH «зависает» из-за потери сетевого соединения. Wi‑Fi может терять пакетную связь, ноутбук может уйти в спящий режим, или вы случайно закрыли крышку ноутбука. SSH изначально разрабатывался в эпоху проводных рабочих станций, поэтому он более хрупок при переключениях сетей и временных разрывах.
Коротко: SSH поддерживает интерактивный терминал через TCP. Если TCP-канал прерывается, клиент «виснет», поскольку он ждёт подтверждений от сервера.
1. Завершение через escape‑последовательность
OpenSSH имеет внутренние escape‑символы. По умолчанию это тильда (~). Escape‑последовательность позволяет отправить команду клиенту, а не удалённой машине.
Стандартный приём для немедленного выхода из клиента SSH:
~.То есть нажмите клавишу тильда, затем точку. Обратите внимание: тильда интерпретируется только если она идёт в начале строки после последнего ввода клавиатуры; если вы набирали текст, нажмите Enter, затем ~. и затем .
Если вы хотите изменить escape‑символ временно, используйте опцию -e:
ssh -e '#' user@hostЧтобы поменять его навсегда, добавьте запись в локальный файл ~/.ssh/config:
Host *
EscapeChar ~(Замените ~ на желаемый символ.)
Важно: escape‑последовательности работают в клиенте OpenSSH. Если вы используете другой клиент, проверьте его документацию.
2. Завершение процесса через kill
Если escape не срабатывает или клиент полностью заморожен, можно завершить процесс вручную.
Найдите PID с помощью ps и grep:
ps aux | grep sshВ выводе ищите строку с вашим пользователем и адресом удалённого хоста — так вы отличите нужную сессию от системных SSH‑процессов.
Когда PID найден, отправьте сигнал TERM или KILL:
kill
# если нужно принудительно:
kill -9 Сигнал TERM даёт процессу шанс корректно завершиться. Используйте kill -9 только если TERM не сработал.
Используйте Mosh для устойчивых соединений
Mosh (Mobile Shell) — это замена SSH для интерактивных терминалов. Он использует UDP и состояние на стороне клиента, поэтому продолжает работать при кратковременных потерях сети и при смене IP (например, переход с Wi‑Fi на сотовую сеть). При восстановлении Mosh синхронизирует ввод/вывод, и вы не теряете работу.
Установка Mosh на популярных дистрибутивах:
sudo apt install moshsudo pacman -S moshsudo dnf install moshMosh хорошо сочетается с tmux или GNU Screen: Mosh обеспечивает устойчивое сетевое соединение, tmux — возможность восстановить сессию и процессы на удалённой машине.
Альтернативные подходы
- Использовать tmux/screen внутри SSH: если соединение разорвётся, вы вернётесь в тот же сеанс при повторном подключении.
- Autossh: автоматический рестарт SSH‑туннелей (подходит для туннелей, но не для интерактивных терминалов).
- SSH через стабильный промежуточный сервер (bastion) с постоянным сетевым каналом.
Методология диагностики зависшей сессии — шаг за шагом
- Нажмите Enter, затем ~. чтобы попыта��ься выйти через escape. Если клиент ответил — всё в порядке.
- Если нет реакции, переключитесь в локальную консоль (Ctrl+Alt+F2 на Linux) или откройте новый терминал.
- Выполните ps aux | grep ssh и найдите PID зависшего клиента.
- Попробуйте kill
. Если после этого клиент не закрылся — kill -9 . - Если подобные зависания происходят часто — установите Mosh и/или tmux.
Роли и чек‑листы
DevOps / Системный администратор:
- Проверить логи сервера (journalctl /var/log/auth.log).
- Настроить tmux на всех сервисных аккаунтах.
- Развернуть Mosh на хостах, куда часто подключаются мобильные пользователи.
Разработчик / Инженер:
- Использовать tmux для долгих задач.
- Настроить в локальной машине alias для ssh с -o ServerAliveInterval=60 и -o ServerAliveCountMax=3.
- Установить Mosh для ноутбука.
Служба поддержки:
- Объяснить пользователю escape‑последовательность и команду kill.
- Предложить Mosh или tmux как долгосрочное решение.
Критерии приёмки
- После применения escape‑последовательности SSH‑клиент завершился или вернул приглашение.
- После kill процесс SSH перестал присутствовать в ps aux.
- После установки Mosh пользователь может продолжать ввод после краткого разрыва сети.
Когда методы не сработают
- Если локальный терминал завис полностью (Xorg/Wayland или терминал-приложение упало), escape‑последовательность не сработает — нужно открыть новый терминал или перезапустить GUI‑сессию.
- Если проблема на стороне сервера (OOM, crash), восстановить соединение можно только после устранения серверной ошибки.
Краткий глоссарий
- SSH: протокол для безопасного доступа к удалённым машинам.
- Mosh: мобильная оболочка, устойчивая к временным потерям сети (использует UDP).
- tmux/screen: мультиплексоры терминала, позволяют возобновить сессию.
- PID: идентификатор процесса в системе Unix.
Частые вопросы
Что делать, если escape‑последовательность не работает и я не вижу PID?
Откройте новый терминал и выполните ps aux | grep ssh; если клиент не отображается, возможно, он завис в состоянии ядра — перезапустите терминал или завершите GUI‑сессию.
Можно ли поменять escape‑символ, чтобы он не конфликтовал с рабочими командами?
Да. Используйте опцию -e при запуске SSH или настройку EscapeChar в ~/.ssh/config.
Краткое резюме
- Попробуйте ~. для быстрого выхода.
- Если это не помогает — найдите PID и используйте kill.
- Для надёжных подключений используйте Mosh и/или tmux.
Важно: Mosh и tmux решают разные задачи — Mosh делает подключение устойчивым к сетевым разрывам, а tmux позволяет возобновлять рабочие процессы на сервере. Вместе они дают наиболее надёжный рабочий поток.
Похожие материалы
Копирование пользовательских представлений Outlook
Очистка Docker-образов и освобождение места
Обновить Cube WP10 до Anniversary Update
Как проверить, запущен ли Docker daemon
Как запланировать твит в Twitter