使用 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/1000

6. 重新启动 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 即可。

最后修改:2026 年 09 月 02 日
如果觉得我的文章对你有用,请随意赞赏