当前位置: 首页 > news >正文

Ubuntu 虚拟显示器自动控制服务设置(有无显示器的切换)

问题描述:ubuntu桌面版在做服务器情况不带显示器的情况下与向日葵等远程办公软件不兼容,引入虚拟显示器方式,但是后续如果要使用物理显示器的话又需要将配置的虚拟显示器文件conf删除(否则物理显示器黑屏或卡死),操作繁琐。本文旨在做一套自动检测,切换配置的脚本教程,解决部分特定场景的需要。

脚本设置

1. 修改脚本(服务将以 root 权限运行)

#!/bin/bash# Ubuntu 虚拟显示器自动控制脚本
# 功能:自动检测显示器状态并相应启用/禁用虚拟显示器CONFIG_PATH="/usr/share/X11/xorg.conf.d/xorg.conf"
CONFIG_CONTENT='
Section "Monitor"Identifier "Monitor0"HorizSync 28.0-80.0VertRefresh 48.0-75.0Modeline "1920x1080_60.00" 172.80 1920 2040 2248 2576 1080 1081 1084 1118 -HSync +Vsync
EndSectionSection "Device"Identifier "Card0"Driver "dummy"VideoRam 256000
EndSectionSection "Screen"DefaultDepth 24Identifier "Screen0"Device "Card0"Monitor "Monitor0"SubSection "Display"Depth 24Modes "1920x1080_60.00"EndSubSection
EndSection
'# 检测是否有真实显示器连接
has_real_display() {# 尝试使用xrandr检测连接的显示器if command -v xrandr >/dev/null 2>&1; then# 检查是否有已连接的显示器(排除虚拟显示器)if xrandr --listmonitors 2>/dev/null | grep -v "dummy" | grep -q " connected"; thenreturn 0 # 有真实显示器fifi# 备用检测方法:检查DRM设备if [ -d "/sys/class/drm" ]; thenfor card in /sys/class/drm/card*-*; doif [ -e "$card/status" ] && [ "$(cat "$card/status" 2>/dev/null)" = "connected" ]; thenif ! echo "$card" | grep -q "dummy"; thenreturn 0 # 有真实显示器fifidonefireturn 1 # 没有真实显示器
}# 创建虚拟显示器配置
create_virtual_display() {echo "正在创建虚拟显示器配置..."mkdir -p /usr/share/X11/xorg.conf.d/echo "$CONFIG_CONTENT" | tee "$CONFIG_PATH" > /dev/nullif [ -f "$CONFIG_PATH" ]; thenecho "✓ 配置文件已创建: $CONFIG_PATH"restart_display_managerreturn 0elseecho "✗ 配置文件创建失败!"return 1fi
}# 删除虚拟显示器配置
remove_virtual_display() {echo "正在禁用虚拟显示器配置..."rm -f "$CONFIG_PATH"if [ ! -f "$CONFIG_PATH" ]; thenecho "✓ 配置文件已禁用"restart_display_managerreturn 0elseecho "✗ 配置文件禁用失败!"return 1fi
}# 重启显示管理器
restart_display_manager() {echo "⏳ 正在重启显示服务..."# 自动检测当前显示管理器if systemctl is-active --quiet gdm3; thensystemctl restart gdm3echo "✓ 已重启 gdm3 服务"elif systemctl is-active --quiet lightdm; thensystemctl restart lightdmecho "✓ 已重启 lightdm 服务"elsesystemctl restart display-managerecho "✓ 已重启 display-manager 服务"fi
}# 自动检测并调整显示器配置
auto_adjust_display() {if has_real_display; then# 有真实显示器,应禁用虚拟显示器if [ -f "$CONFIG_PATH" ]; thenecho "检测到真实显示器,禁用虚拟显示器..."remove_virtual_displayelseecho "检测到真实显示器,无需调整"fielse# 无真实显示器,应启用虚拟显示器if [ ! -f "$CONFIG_PATH" ]; thenecho "未检测到真实显示器,启用虚拟显示器..."create_virtual_displayelseecho "未检测到真实显示器,无需调整"fifi
}# 主函数 - 直接启动自动监听模式
main() {echo "启动 Ubuntu 虚拟显示器自动控制脚本"# 初始检测一次auto_adjust_display# 然后每10秒检测一次while true; dosleep 10auto_adjust_displaydone
}# 运行主函数
main

2. 保存脚本并设置权限

sudo nano /usr/local/bin/virtual-display-manager.sh
# 粘贴上面的脚本内容
sudo chmod +x /usr/local/bin/virtual-display-manager.sh

系统服务配置

3. 创建系统服务文件

sudo nano /etc/systemd/system/virtual-display-manager.service

添加以下内容:

[Unit]
Description=Virtual Display Manager
After=multi-user.target[Service]
Type=simple
ExecStart=/usr/local/bin/virtual-display-manager.sh
Restart=always
RestartSec=10
User=root[Install]
WantedBy=multi-user.target

4. 启用并启动服务

sudo systemctl daemon-reload
sudo systemctl enable virtual-display-manager.service
sudo systemctl start virtual-display-manager.service

或者重启服务:

sudo systemctl restart virtual-display-manager.service

5. 检查服务状态

sudo systemctl status virtual-display-manager.service

服务管理命令

启动服务

sudo systemctl start virtual-display-manager.service

停止服务

sudo systemctl stop virtual-display-manager.service

重启服务

sudo systemctl restart virtual-display-manager.service

禁用开机自启动

sudo systemctl disable virtual-display-manager.service

查看服务日志

sudo journalctl -u virtual-display-manager.service -f

功能说明

这样设置后,脚本将在系统启动时自动运行,并在后台持续监控显示器状态,根据需要启用或禁用虚拟显示器。服务会在意外停止时自动重启(每10秒检查一次),确保始终运行。

注意:切换虚拟显示器配置时会重启显示管理器服务,这将终止当前图形会话和所有运行的图形应用程序。以下是详细说明:

类别

会被终止 (❌)

不会终止 (✅)

应用程序

所有带有图形界面的程序(浏览器、IDE、办公软件)

无图形界面的命令行工具(如 curlwget

终端/Shell

所有图形终端模拟器(GNOME Terminal, Konsole)

文本控制台(tty1-6)中的 Shell

进程类型

在图形终端中运行的前台进程

使用 tmux/screen/nohup 运行的进程

系统服务

所有由 systemd 管理的服务(nginx, docker, sshd)

用户界面

整个桌面环境(GNOME, KDE Plasma, XFCE)

因此,在执行此脚本之前(插入或者拔出物理显示器时),务必要保存所有图形应用程序中的重要工作。 对于需要长时间运行的任务,强烈建议在 tmux 或 screen 会话中启动它们,这样即使图形界面重启,任务也会在后台继续运行,之后可以重新连接恢复。

http://www.dtcms.com/a/340616.html

相关文章:

  • pip 安装常见错误及实例化解决办法大全
  • 计算机网络技术学习-day4《路由器配置》
  • ubuntu下安装vivado2015.2时报错解决方法
  • SPI 机制深度剖析:Java、Spring、Dubbo 的服务发现哲学与实战指南
  • 根据Wireshark捕获数据包时间和长度绘制路由器发送给电脑数据的信号波形
  • 【FreeRTOS】临界资源管理
  • 树上背包(P2014 [CTSC1997] 选课)
  • 经营帮租赁经营板块:解锁资产运营新生态,赋能企业增长新引擎
  • 【最后203篇系列】034 使用SQLite构建简单的任务管理
  • Qt5.9.9 + Windows API 开发系统监控工具 - 教学级项目实战
  • Obsidian 1.9.10升级
  • 19.web api 10
  • SQL-leetcode— 2356. 每位教师所教授的科目种类的数量
  • 有关SWD 仿真和PA.15, PB3, PB4的冲突问题
  • 深入Linux内核:架构设计与核心功能解析
  • CSS3DRenderer+ CSS3DObject实现在 Three.js 中添加文本内容
  • 算法230. 二叉搜索树中第 K 小的元素
  • 10M25DCF484C8G Altera FPGA MAX10
  • 云原生俱乐部-RH294知识点归纳(1)
  • RK-Android11-PackageInstaller安装器自动安装功能实现
  • iOS App 混淆工具实战 医疗健康类 App 的安全与合规保护
  • 电脑驱动免费更新? 这款驱动管理工具:一键扫更新,还能备份恢复,小白也会用~
  • 【知识杂记】方差、标准差、均方误差、均方根误差与平均绝对误差,概念、计算公式、物理意义
  • 微型导轨的快速调平技术如何提升激光加工效率?
  • Python默认参数
  • CPTS--Administrator
  • 【clion】调试脚本并cmake构建Fargo项目win32版本
  • Spring Boot 配置
  • C++---向下取整(>>)与向零取整(/)
  • Vue2封装Axios