SSH-сессия с пробросом графики зависает при выходе после запуска графической программы: процесс dbus-launch держит канал

Что было. Подключение ssh -X к серверу, запуск графического приложения, закрытие приложения, exit. Вместо возврата в локальную оболочку терминал висит, пока не нажать Ctrl-C.

Причина. При запуске графического приложения в сессии стартовал dbus-launch, который остался жить после закрытия приложения и держит открытым проброшенный X11-канал. ssh по умолчанию не закрывает сессию, пока живы процессы, держащие её каналы. Автор добавил в ~/.bash_logout завершение этого процесса; участник подтвердил, что это безопасно, если dbus-launch нужен только для SSH-сессии, и предложил вариант с --exit-with-session.

Варианты.

  1. ~/.bash_logout: pkill -u "$USER" dbus-launch 2>/dev/null (мягче, чем -KILL).
  2. Запускать оболочку так, чтобы шина умирала с ней: ssh -X host "dbus-launch --exit-with-session bash".
  3. Аварийно разорвать зависшую сессию без закрытия терминала: последовательность Enter ~ . (управляющий символ ssh) на клиенте.
  4. Приложения, которые сами создают фоновые процессы (обновление, индексация): запускать через setsid/nohup … & только если действительно нужно, чтобы они пережили сессию; иначе завершать перед выходом.

Тот же механизм в других ситуациях.

  • Скрипт запустил фоновый процесс (&) без перенаправления вывода: сессия висит, пока процесс держит stdout. Лечится > /dev/null 2>&1 & или nohup.
  • Проброс портов (-L/-R) с активными соединениями: ssh ждёт их закрытия; -o ExitOnForwardFailure не поможет, нужен разрыв соединений или ~..
  • Оставленные screen/tmux наоборот, не мешают: они отвязаны от терминала.

Про графику на серверах. Проброс X11 на сервер требует установленных библиотек X, тянет зависимости и открывает дополнительный канал. Для редких задач лучше веб-интерфейс, для частых VNC/RDP к отдельной машине, а на сервере оставлять X11Forwarding no в sshd_config, если в нём нет постоянной нужды.

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