Вопрос или проблема
пользователь не может подключиться к серверу через xrdp
тестировалось с использованием клиента удаленного рабочего стола Linux, а также клиента удаленного рабочего стола Windows
сообщение об ошибке: “ошибка: проблема с подключением”
/var/log/sesman.log
показывает эту ошибку
[20170419-22:06:02] [INFO ] поток scp на сокете 7 успешно запущен
[20170419-22:06:02] [INFO ] ++ переподключенная сессия: имя пользователя test,
дисплей :47.0, session_pid 2869, ip xxx.xxx.xxx.xxx:53732 - сокет: 7
поиск этого процесса
root@server:/etc/xrdp# ps -aux | grep defunct
root 2869 0.0 0.0 0 0 ? Z 19:08 0:00
[xrdp-sessvc] <defunct>
попытка убить процесс
kill -9 2869
не убивает процесс
как я могу убить этот процесс?
пользователи не могут войти в то, что файл журнала говорит, что существует сессия
однако при просмотре отключенных tcp-сессий (не установленные соединения, а только прослушивающие порты) я не вижу никаких сессий, существующих для этого пользователя
это хроническая, постоянно повторяющаяся проблема, которая, похоже, не проявляется в каком-либо регулярном порядке
что я могу сделать?
перечисление всех сессий xrdp
#!/bin/bash
# найти отключенные RDP сессии
lsof -b -w -n -c /^Xvnc$/b -a -iTCP:5900-5999
не показывает отключенных сессий (все tcp-соединения установлены для всех подключенных пользователей)
xrdp ведет журнал сессий внутри файлов .xrdp*, хранимых в домашнем каталоге пользователя. Может случиться так, что некоторые файлы сессий .xrdp* будут храниться в /tmp/ или /tmp/.xrdp/. Служба xrdp создает связь с этими файловыми сессиями.
Итак, чтобы снова установить соединение, когда у вас есть неактивные процессы, у вас есть три варианта:
- создать новое соединение, используя другое разрешение (работает как обходное решение, но я не рекомендую этого)
- удалить файлы .vnc/sessman* из домашнего каталога затронутых пользователей, файлы xrdp* в /tmp и /tmp/.xrdp/ для затронутого пользователя и подключиться снова. (рекомендуемое решение)
- перезапустить службу xrdp, которая очистит связь с файловыми сессиями. (рекомендуется только если вы можете позволить время простоя сессий xrdp 🙂 )
Для всех, кто столкнулся с этой проблемой: я обнаружил, что сервер xrdp хранит некоторую информацию о состоянии отключенных сессий. Даже анализ всех TCP-соединений и убийство прослушивающих, но не установленных портов не решает эту проблему (хотя это решает огромную проблему ненужного распределения ресурсов).
Я обнаружил, что не могу избавиться от зомби и заставить XRDP создать новую сессию вместо попытки переподключиться к предыдущему состоянию, не перезапустив сервер XRDP.
Единственный трюк, который я нашел, это изменить разрешение экрана клиента, чтобы обмануть сервер xrdp и заставить его думать, что это новая машина. Это позволяет подключение быть принятым и устанавливает новую сессию.
Немного запоздал, но почему это происходит, я не уверен, но мой сервер с временем работы всего 7 месяцев имел тысячи неактивных процессов xrdp. Я очищаю его с помощью “sudo systemctl restart xrdp.service”.
Можно отредактировать sesman.ini и добавить:
KillDisconnected=true #(чтобы очищать отключенных пользователей)
DisconnectedTimeLimit=60 #(или какой-то другой таймаут.... в секундах)
Это приведет к ситуации, когда вы не сможете переподключиться к последней сессии, но предотвратит мертвые сессии.
Ответ или решение
Устранение проблем с сеансами XRDP: Как избавиться от "мертвых" процессов
Проблемы с подключением к серверу через XRDP могут доставлять значительные неудобства пользователям. По вашему описанию видно, что вы сталкиваетесь с ситуацией, когда пользователи не могут войти в систему, так как в логах отображается информация о "мертвых" сеансах. В данном ответе мы подробно рассмотрим возможные решения этой проблемы и предоставим рекомендации на будущее.
Анализ ситуации
Из предоставленной информации видно, что у вас есть следующее:
- Пользователи не могут подключиться к серверу через XRDP, а при попытке подключения возникает ошибка "error: problem connecting".
- Логи (
/var/log/sesman.log
) указывают на наличие "мертвого" процесса (<defunct>
), что может свидетельствовать о том, что предыдущий сеанс пользователя не был корректно завершен. - Попытка принудительного завершения мертвого процесса с помощью команды
kill -9
не дала результатов, потому что "мертвые" процессы не могут быть убиты таким образом.
Возможные решения:
-
Очистка временных файлов сеансов:
Удаление.vnc/sessman*
файлов из домашней директории пользователя, а также.xrdp*
файлов из/tmp/
и/tmp/.xrdp/
для затронутых пользователей может помочь. Это является рекомендуемым решением, так как оно очищает информацию о старых сеансах и позволяет установить новое подключение.rm -rf /tmp/.xrdp/* rm -rf /home/username/.vnc/sessman*
-
Перезапуск службы XRDP:
Если вы можете позволить себе перезапустить XRDP, это также может решить проблему. Это очистит все процессы XRDP и отключенные сеансы.sudo systemctl restart xrdp.service
-
Изменение разрешения экрана клиента:
Изменение разрешения может обойти проблему временно, так как сервер будет воспринимать подключение как новое. Однако это не рекомендуется как стабильное решение, так как оно не устраняет основную проблему с "мертвыми" сеансами. -
Настройка параметров конфигурации sesman:
Чтобы остановить накопление мертвых процессов в будущем, можно внести изменения в файл конфигурацииsesman.ini
. Добавьте следующие строки:KillDisconnected=true DisconnectedTimeLimit=60
Это позволит автоматически завершать сеансы, которые были отключены более 60 секунд назад, что поможет избежать проблем с неактивными сеансами.
Заключение
Проблема с неработающими или "мертвыми" сеансами XRDP может быть решена различными способами, в зависимости от того, насколько быстро вы хотите ее исправить и сколько времени вы готовы выделить на обслуживание. Наилучшим подходом будет регулярная очистка временных файлов и настройка параметров конфигурации XRDP для предотвращения таких случаев в будущем. Если проблема сохраняется, необходимо будет провести более глубокий анализ системных логов и, возможно, рассмотреть возможность обновления версии XRDP или Linux, чтобы исправить известные ошибки.
Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться за поддержкой!