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

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.xdnf.cn/news/18265.html

相关文章:

  • 华为数通认证学习
  • 微算法科技(NASDAQ: MLGO)引入高级区块链DSR算法:重塑区块链网络安全新范式
  • K8S-Configmap资源
  • C++中的 Eigen库使用
  • 数据库DML语言(增、删、改)
  • oracle服务器导入dmp文件
  • Causal-Copilot: An Autonomous Causal Analysis Agent 论文解读
  • 栈的概念(韦东山学习笔记)
  • C#APP.Config配置文件解析
  • Java内功修炼(2)——线程安全三剑客:synchronized、volatile与wait/notify
  • 5.4 4pnpm 使用介绍
  • kotlin 协程笔记
  • AI 创业公司分析报告:RealRoots
  • 0基础安卓逆向原理与实践:第2章:编程基础与工具链
  • 使用PCL读取PCD点云文件
  • Pandas 数据处理核心操作:合并、替换、统计与分组
  • 分贝单位全指南:从 dB 到 dBm、dBc
  • 深入解析EventPoller:Disruptor的轮询式事件处理机制
  • k8s笔记01
  • 服务器硬盘进行分区和挂载
  • SLAM文献之-Globally Consistent and Tightly Coupled 3D LiDAR Inertial Mapping
  • AI +金融 = 七大核心维度+ 落地典型困难
  • 【Golang实战】Go Module 双段 require 配置深度解析
  • Lecture 5 GPUs课程笔记
  • C语言---编译的最小单位---令牌(Token)
  • 认识Node.js及其与 Nginx 前端项目区别
  • KubeBlocks AI:AI时代的云原生数据库运维探索
  • Notepad++批量转UTF-8脚本
  • Flink Stream API - 顶层Operator接口StreamOperator源码超详细讲解
  • 结合SAT-3D,运动+饮食双重养腰新方式