windows通过远程桌面ubuntu时黑屏,如何优雅地处理rdp黑屏
你需要更好的断开RDP连接方案
方案一:优雅断开脚本(推荐)
创建智能断开脚本 /usr/local/bin/rdp-disconnect:
#!/bin/bash
# 优雅断开 RDP 连接脚本
USERNAME=$(whoami)
SESSION_INFO=$(loginctl list-sessions | grep $USERNAME)
if [ -z "$SESSION_INFO" ]; then
echo "没有找到活动会话"
exit 0
fi
SESSION_ID=$(echo $SESSION_INFO | awk '{print $1}')
echo "当前会话信息:"
echo "$SESSION_INFO"
echo ""
echo "选择操作:"
echo "1. 优雅断开(保持后台运行)"
echo "2. 完全注销(结束所有程序)"
echo "3. 清理并重新连接"
echo "4. 查看会话详情"
read -p "请输入选择 (1-4): " choice
case $choice in
1)
# 优雅断开 - 发送 TERM 信号
loginctl terminate-session $SESSION_ID --signal=TERM
echo "已发送断开信号,会话将在后台保持"
;;
2)
# 完全注销 - 强制结束
loginctl terminate-session $SESSION_ID --signal=KILL
echo "会话已完全结束"
;;
3)
# 清理方案:彻底结束并清理
echo "执行彻底清理..."
# 1. 结束会话
loginctl terminate-session $SESSION_ID --signal=KILL
# 2. 清理残留进程
pkill -9 -u $USERNAME Xvnc 2>/dev/null
pkill -9 -u $USERNAME xrdp 2>/dev/null
# 3. 清理临时文件
rm -f /tmp/.X$SESSION_ID-lock 2>/dev/null
rm -f /tmp/.X11-unix/X$SESSION_ID 2>/dev/null
# 4. 重启 xrdp 服务(可选)
read -p "重启 xrdp 服务?(y/n): " restart_choice
if [[ $restart_choice == "y" || $restart_choice == "Y" ]]; then
sudo systemctl restart xrdp
echo "xrdp 服务已重启"
fi
echo "清理完成,可以重新连接"
;;
4)
# 查看详情
loginctl session-status $SESSION_ID
;;
*)
echo "无效选择"
;;
esac
设置权限:
sudo chmod +x /usr/local/bin/rdp-disconnect
sudo chown root:root /usr/local/bin/rdp-disconnect
方案二:自动会话清理服务
创建系统服务自动清理残留会话:
-
创建清理脚本
/opt/scripts/cleanup-rdp.sh:
#!/bin/bash
# 自动清理 RDP 残留会话
cleanup_session() {
local user=$1
local session=$2
# 清理用户会话
loginctl terminate-session $session 2>/dev/null
# 清理进程
pkill -9 -u $user Xvnc 2>/dev/null
pkill -9 -u $user xrdp-chansrv 2>/dev/null
# 清理文件锁
rm -f /tmp/.X${session#*}-lock 2>/dev/null
rm -f /tmp/.X11-unix/X${session#*} 2>/dev/null
# 清理用户运行时目录
rm -rf /run/user/$(id -u $user)/xrdp-display* 2>/dev/null
}
# 检查超过30分钟的空闲会话
loginctl list-sessions --no-legend | while read session uid user seat state tty; do
if [[ $state == "active" || $state == "online" ]]; then
session_time=$(loginctl show-session $session -p Timestamp | cut -d= -f2)
current_time=$(date +%s)
idle_time=$((current_time - session_time))
if [ $idle_time -gt 1800 ]; then # 30分钟
echo "清理空闲会话: $user ($session)"
cleanup_session $user $session
fi
elif [[ $state == "closing" || $state == "lingering" ]]; then
echo "清理残留会话: $user ($session)"
cleanup_session $user $session
fi
done
-
创建 systemd 服务
/etc/systemd/system/rdp-cleanup.service:
[Unit]
Description=RDP Session Cleanup Service
After=network.target xrdp.service
[Service]
Type=oneshot
ExecStart=/opt/scripts/cleanup-rdp.sh
User=root
[Install]
WantedBy=multi-user.target
-
创建定时器
/etc/systemd/system/rdp-cleanup.timer:
[Unit]
Description=Clean up RDP sessions every 5 minutes
[Timer]
OnBootSec=5min
OnUnitActiveSec=5min
Persistent=true
[Install]
WantedBy=timers.target
启用服务:
sudo chmod +x /opt/scripts/cleanup-rdp.sh
sudo systemctl daemon-reload
sudo systemctl enable rdp-cleanup.timer
sudo systemctl start rdp-cleanup.timer
方案三:改进的 RDP 配置
修改 xrdp 配置防止黑屏:
-
备份并编辑配置文件:
sudo cp /etc/xrdp/xrdp.ini /etc/xrdp/xrdp.ini.backup
sudo nano /etc/xrdp/xrdp.ini
-
修改关键配置:
[xrdp1]
name=sesman-Xvnc
lib=libvnc.so
username=ask
password=ask
ip=127.0.0.1
port=-1
code=20
# 添加以下参数
delay_ms=2000
max_bpp=24
use_compression=yes
preferred_encoding=16
# 防止黑屏的关键设置
tcp_keepalive=yes
tcp_send_buffer=true
tcp_recv_buffer=true
# 使用新会话而不是恢复
new_cursors=yes
# 避免会话冲突
fork=true
-
修改 sesman.ini:
sudo nano /etc/xrdp/sesman.ini
[Globals]
ListenAddress=127.0.0.1
ListenPort=3350
EnableUserWindowManager=true
[Security]
AllowRootLogin=yes
MaxLoginRetry=4
TerminalServerUsers=any
TerminalServerAdmins=any
# 会话配置
[Sessions]
X11DisplayOffset=10
MaxSessions=10
KillDisconnected=true # 重要:断开后结束会话
DisconnectedTimeLimit=60 # 60秒后清理
IdleTimeLimit=1800 # 30分钟空闲限制
MaxIdleTime=1800
# 使用重新连接模式而非恢复模式
ReconnectScript=/etc/xrdp/reconnect.sh
方案四:使用 Xrdp 替代方案
如果问题持续,考虑使用替代方案:
-
使用 X2Go(更稳定):
# 安装 X2Go
sudo apt-add-repository ppa:x2go/stable
sudo apt update
sudo apt install x2goserver x2goserver-xsession
# 使用 X2Go 客户端连接
-
使用 NoMachine:
# 下载安装 NoMachine
wget https://download.nomachine.com/download/8.8/Linux/nomachine_8.8.1_1_amd64.deb
sudo dpkg -i nomachine_*.deb
方案五:一键修复脚本
创建黑屏修复脚本 /usr/local/bin/fix-rdp-blackscreen:
#!/bin/bash
# RDP 黑屏修复脚本
echo "=== RDP 黑屏修复工具 ==="
# 1. 结束所有相关进程
echo "步骤1: 结束相关进程..."
sudo pkill -9 Xvnc 2>/dev/null
sudo pkill -9 xrdp 2>/dev/null
sudo pkill -9 xrdp-sesman 2>/dev/null
# 2. 清理临时文件
echo "步骤2: 清理临时文件..."
sudo rm -rf /tmp/.X11-unix/* 2>/dev/null
sudo rm -rf /tmp/.X* 2>/dev/null
sudo rm -rf /var/run/xrdp/* 2>/dev/null
# 3. 清理用户会话
echo "步骤3: 清理用户会话..."
for uid in $(loginctl list-sessions --no-legend | awk '{print $2}' | sort -u); do
sudo loginctl terminate-user $uid 2>/dev/null
done
# 4. 重启服务
echo "步骤4: 重启服务..."
sudo systemctl restart xrdp
sudo systemctl restart xrdp-sesman
# 5. 检查服务状态
echo "步骤5: 检查服务状态..."
sudo systemctl status xrdp --no-pager
sudo systemctl status xrdp-sesman --no-pager
echo "=== 修复完成 ==="
echo "请等待10秒后重新连接"
设置权限:
sudo chmod +x /usr/local/bin/fix-rdp-blackscreen
最佳实践流程
日常断开连接的正确方法:
-
在 RDP 客户端中:
-
使用右上角菜单 → "断开"(不是注销)
-
或者使用快捷键
Ctrl + Alt + End→ 选择"断开"
-
-
如果遇到黑屏,在 Ubuntu 上执行:
# 方法1: 使用修复脚本 fix-rdp-blackscreen # 方法2: 简单重启服务 sudo systemctl restart xrdp # 方法3: 清理用户会话 sudo pkill -u your_username -
预防性配置:
# 设置自动清理定时任务 sudo crontab -e # 添加: */10 * * * * /opt/scripts/cleanup-rdp.sh总结建议:正确使用RDP服务,连接结束后主动断开用户或给常用服务开守护或nohup启动程序,使注销后仍可用。

浙公网安备 33010602011771号