windows通过远程桌面ubuntu时黑屏,如何优雅地处理rdp黑屏

你需要更好的断开RDP连接方案

方案一:优雅断开脚本(推荐)

创建智能断开脚本 /usr/local/bin/rdp-disconnect

bash
#!/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

设置权限:

bash
sudo chmod +x /usr/local/bin/rdp-disconnect
sudo chown root:root /usr/local/bin/rdp-disconnect

方案二:自动会话清理服务

创建系统服务自动清理残留会话:

  1. 创建清理脚本 /opt/scripts/cleanup-rdp.sh

bash
#!/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
  1. 创建 systemd 服务 /etc/systemd/system/rdp-cleanup.service

ini
[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
  1. 创建定时器 /etc/systemd/system/rdp-cleanup.timer

ini
[Unit]
Description=Clean up RDP sessions every 5 minutes

[Timer]
OnBootSec=5min
OnUnitActiveSec=5min
Persistent=true

[Install]
WantedBy=timers.target

启用服务:

bash
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 配置防止黑屏:

  1. 备份并编辑配置文件:

bash
sudo cp /etc/xrdp/xrdp.ini /etc/xrdp/xrdp.ini.backup
sudo nano /etc/xrdp/xrdp.ini
  1. 修改关键配置:

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
  1. 修改 sesman.ini:

bash
sudo nano /etc/xrdp/sesman.ini
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 替代方案

如果问题持续,考虑使用替代方案:

  1. 使用 X2Go(更稳定):

bash
# 安装 X2Go
sudo apt-add-repository ppa:x2go/stable
sudo apt update
sudo apt install x2goserver x2goserver-xsession

# 使用 X2Go 客户端连接
  1. 使用 NoMachine:

bash
# 下载安装 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

bash
#!/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秒后重新连接"

设置权限:

bash
sudo chmod +x /usr/local/bin/fix-rdp-blackscreen

最佳实践流程

日常断开连接的正确方法:

  1. 在 RDP 客户端中:

    • 使用右上角菜单 → "断开"(不是注销)

    • 或者使用快捷键 Ctrl + Alt + End → 选择"断开"

  2. 如果遇到黑屏,在 Ubuntu 上执行:

    bash
    # 方法1: 使用修复脚本
    fix-rdp-blackscreen
    
    # 方法2: 简单重启服务
    sudo systemctl restart xrdp
    
    # 方法3: 清理用户会话
    sudo pkill -u your_username
  3. 预防性配置:

    bash
    # 设置自动清理定时任务
    sudo crontab -e
    # 添加:
    */10 * * * * /opt/scripts/cleanup-rdp.sh


    总结建议:正确使用RDP服务,连接结束后主动断开用户或给常用服务开守护或nohup启动程序,使注销后仍可用。

     
posted @ 2025-12-03 13:50  zhg1016  阅读(47)  评论(0)    收藏  举报