Что было. Подключение ssh -X к серверу, запуск графического приложения, закрытие приложения, exit. Вместо возврата в локальную оболочку терминал висит, пока не нажать Ctrl-C.
Причина. При запуске графического приложения в сессии стартовал dbus-launch, который остался жить после закрытия приложения и держит открытым проброшенный X11-канал. ssh по умолчанию не закрывает сессию, пока живы процессы, держащие её каналы. Автор добавил в ~/.bash_logout завершение этого процесса; участник подтвердил, что это безопасно, если dbus-launch нужен только для SSH-сессии, и предложил вариант с --exit-with-session.
Варианты.
~/.bash_logout:pkill -u "$USER" dbus-launch 2>/dev/null(мягче, чем-KILL).- Запускать оболочку так, чтобы шина умирала с ней:
ssh -X host "dbus-launch --exit-with-session bash". - Аварийно разорвать зависшую сессию без закрытия терминала: последовательность
Enter ~ .(управляющий символ ssh) на клиенте. - Приложения, которые сами создают фоновые процессы (обновление, индексация): запускать через
setsid/nohup … &только если действительно нужно, чтобы они пережили сессию; иначе завершать перед выходом.
Тот же механизм в других ситуациях.
- Скрипт запустил фоновый процесс (
&) без перенаправления вывода: сессия висит, пока процесс держитstdout. Лечится> /dev/null 2>&1 &илиnohup. - Проброс портов (
-L/-R) с активными соединениями:sshждёт их закрытия;-o ExitOnForwardFailureне поможет, нужен разрыв соединений или~.. - Оставленные
screen/tmuxнаоборот, не мешают: они отвязаны от терминала.
Про графику на серверах. Проброс X11 на сервер требует установленных библиотек X, тянет зависимости и открывает дополнительный канал. Для редких задач лучше веб-интерфейс, для частых VNC/RDP к отдельной машине, а на сервере оставлять X11Forwarding no в sshd_config, если в нём нет постоянной нужды.
Управляющие последовательности описаны в документации OpenSSH.