使用 XRDP 连接 Ubuntu 远程桌面时,如果客户端因为突然断网、网络切换或休眠导致连接异常中断,重新连接后可能会出现一种比较典型的问题:桌面能够正常恢复,之前打开的软件也还在,但本地与远程 Ubuntu 之间的复制粘贴失效。其原因通常不是整个 XRDP 会话损坏,而是负责剪贴板、磁盘重定向等虚拟通道的 xrdp-chansrv 进程没有在异常重连后正确恢复。此时没必要重启服务器,也没必要销毁整个图形桌面,只需要重新启动当前用户对应的 xrdp-chansrv 即可。
1. 找到当前用户的 XRDP 会话
先通过 SSH 登录服务器,然后执行:
ps -u "$USER" -f | grep -E 'Xorg|xrdp-chansrv' | grep -v grep正常情况下可以看到类似:
user 123456 ... /usr/lib/xorg/Xorg :12 ...
user 123457 ... /usr/sbin/xrdp-chansrv其中:
Xorg :12说明当前 XRDP 图形桌面的 Display 是:
:12不要杀掉这个 Xorg 进程,否则整个远程桌面以及其中打开的软件都会退出。
2. 获取当前 XRDP Display
可以直接从当前用户的 Xorg 进程中提取 Display:
XRDP_DISPLAY=$(ps -u "$USER" -o args= \
| sed -n 's|.*Xorg \(:[0-9][0-9]*\).*xrdp/xorg.conf.*|\1|p' \
| head -n 1)
echo "$XRDP_DISPLAY"正常应该输出类似:
:12如果没有输出,可以先手动执行:
ps -u "$USER" -f | grep 'Xorg :'确认自己的 XRDP Display。
3. 找到并结束旧的 xrdp-chansrv
查看当前用户的 xrdp-chansrv:
pgrep -a -u "$USER" xrdp-chansrv然后结束它:
pkill -u "$USER" -x xrdp-chansrv再次检查:
pgrep -a -u "$USER" xrdp-chansrv如果看到类似:
[xrdp-chansrv] <defunct>说明旧进程实际上已经退出,只是父进程暂时还没有回收它,不影响后续操作。
4. 清理 thinclient\_drives 挂载
XRDP 的磁盘重定向通常会挂载在:
~/thinclient_drives先检查:
mount | grep "$HOME/thinclient_drives"如果存在挂载,尝试卸载:
fusermount3 -u "$HOME/thinclient_drives" 2>/dev/null || \
fusermount -u "$HOME/thinclient_drives" 2>/dev/null || true再次检查:
mount | grep "$HOME/thinclient_drives"没有输出即可。
如果提示:
not mounted或者:
entry not found通常说明旧挂载已经随着 xrdp-chansrv 的退出自动清理,可以忽略。
5. 设置当前 XRDP 会话环境
获取当前用户 UID:
USER_UID=$(id -u)设置环境变量:
export DISPLAY="$XRDP_DISPLAY"
export XAUTHORITY="$HOME/.Xauthority"
export XDG_RUNTIME_DIR="/run/user/$USER_UID"可以确认一下:
echo "DISPLAY=$DISPLAY"
echo "XAUTHORITY=$XAUTHORITY"
echo "XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR"例如:
DISPLAY=:12
XAUTHORITY=/home/user/.Xauthority
XDG_RUNTIME_DIR=/run/user/10006. 重新启动 xrdp-chansrv
执行:
nohup /usr/sbin/xrdp-chansrv \
> "/tmp/xrdp-chansrv-$USER.log" 2>&1 &检查进程:
pgrep -a -u "$USER" xrdp-chansrv应该可以看到新的:
/usr/sbin/xrdp-chansrv检查日志:
cat "/tmp/xrdp-chansrv-$USER.log"如果只有:
nohup: ignoring input而没有其他报错,一般说明启动正常。
7. 断开并重新连接 XRDP
新的 xrdp-chansrv 启动后,当前已经建立的 RDP 连接未必会自动重新建立 clipboard channel,因此还需要:
关闭当前 RDP 客户端连接
↓
不要注销 Ubuntu 桌面
↓
重新连接 XRDP
↓
进入原来的桌面然后重新测试:
本地 → Ubuntu
Ubuntu → 本地的复制粘贴。
正常情况下此时剪贴板即可恢复。
一套通用命令
实际使用时,可以将整个过程简化成下面这些命令:
# 获取当前用户的 XRDP Display
XRDP_DISPLAY=$(ps -u "$USER" -o args= \
| sed -n 's|.*Xorg \(:[0-9][0-9]*\).*xrdp/xorg.conf.*|\1|p' \
| head -n 1)
echo "XRDP display: $XRDP_DISPLAY"
# 确认找到了 XRDP session
if [ -z "$XRDP_DISPLAY" ]; then
echo "Cannot find XRDP Xorg session."
exit 1
fi
# 结束当前用户旧的 chansrv
pkill -u "$USER" -x xrdp-chansrv
# 清理旧的磁盘重定向挂载
fusermount3 -u "$HOME/thinclient_drives" 2>/dev/null || \
fusermount -u "$HOME/thinclient_drives" 2>/dev/null || true
# 设置当前 XRDP session 环境
export DISPLAY="$XRDP_DISPLAY"
export XAUTHORITY="$HOME/.Xauthority"
export XDG_RUNTIME_DIR="/run/user/$(id -u)"
# 重新启动 chansrv
nohup /usr/sbin/xrdp-chansrv \
> "/tmp/xrdp-chansrv-$USER.log" 2>&1 &
# 检查结果
sleep 1
pgrep -a -u "$USER" xrdp-chansrv执行完成后:
断开 RDP
→
重新连接
→
测试剪贴板即可。
注意事项
这套方法最大的优点是只处理当前用户的:
xrdp-chansrv而不处理:
Xorg
xrdp
xrdp-sesman因此在多人服务器上也比较安全,不会主动影响其他用户的 XRDP 桌面。
尤其不要直接使用:
sudo killall xrdp-chansrv因为这样会把其他 XRDP 用户的 xrdp-chansrv 一并结束。
同样不要随意:
sudo pkill Xorg或者一开始就执行:
sudo systemctl restart xrdp如果问题表现为:
桌面正常
软件正常
鼠标键盘正常
只有剪贴板失效优先单独重建当前用户的 xrdp-chansrv 即可。