问题:
在基于 Ubuntu 的笔记本电脑上,当我睡眠或断开外接显示器的电源,然后启动系统或重新连接显示器时,显示屏不会亮起。
穷人的解决方案:
我发现让外接显示器工作的唯一方法(除了重启)是从“连接显示”切换到“镜像显示”。显示器启动后,我只需取消“镜像显示”的更改,显示器设置就会恢复,外接显示器就可以正常工作了。
不满:
不幸的是,这会导致我的外接显示器上的窗口在桌面工作区中排列混乱(此处的 PopOS 是 Ubuntu 20.10)。在镜像/取消过程之后重新排列工作区需要付出相当大的努力。
充满希望的问题:
是否有任何命令行实用程序可以强制外部显示器重置,而无需从“连接显示”更改为“镜像”?
答案1
我的笔记本电脑和外接 HDMI 显示器上的 PopOS 22.04 (jammy) 也遇到了类似的问题。这是一个一旦实施就会自动生效的解决方案。
0.找出一些有用的常量:
- 您的用户名:这应该是不言自明的。您可以
whoami
在非特权 shell 终端中运行以查找。在下面的命令中,当我指定 时USERNAME
,请将其替换为您的用户名。 - 屏幕的显示标识符:当您的显示器正常工作,您可以运行
xrandr | grep ' connected'
(保留引号内的空格)并查看输出。第一列包含显示标识符。例如,我的内部显示器是eDP-1
,而我的外部显示器是HDMI-1-0
。下面我将在我的脚本中使用这些值,如果它们不同,请将它们替换为您的值。 - 环境
DISPLAY
变量:echo $DISPLAY
在非特权 shell 终端中运行即可找到。我的是:1
,所以下面就用它。如果你的值不同,请用:1
你自己的值替换。
1. 在 创建以下脚本/usr/lib/pm-utils/sleep.d/99_external_monitor_wake
:
#!/bin/bash
DISPLAY=:1; export DISPLAY
case "$1" in
suspend | hibernate | pre)
# no operation
:
;;
resume | thaw | post)
# wakes the external monitor connected to the HDMI port
xrandr --output HDMI-1-0 --auto --left-of eDP-1 --primary
sleep 3
xrandr --output HDMI-1-0 --auto --left-of eDP-1 --primary
;;
esac
exit 0
您需要根据您的设置调整该脚本。
首先要改变的是DISPLAY=:1
。这将设置DISPLAY
我们在第 0.2 节。以上。如果不同,请用您自己的值替换。
第二件要改变的是这两xrandr --output HDMI-1-0 --auto --left-of eDP-1 --primary
行。首先,你需要将我们在上文中找到的显示标识符替换为第 0.1 节。使用您自己的值。我还将 HDMI 显示器设置为内部显示器的左侧,并将外部显示器设为主显示器。您可能希望用 替换--left-of
,--right-of
也可能希望省略该--primary
标志。通过键入 来阅读 xrandr 的手册页man xrandr
以了解更多详细信息。请记住对两行命令进行相同的更改。
如果我上面指定的 3 秒不适合您,您还可以尝试睡眠时间。这有点像使用 AED(我不知道我不是急救人员):您先给它一个电击,然后在它处于能够接收状态时偷偷输入第二个命令。
2. 将脚本的所有者更改为您的用户,并使其可执行:
sudo chown USERNAME:USERNAME /usr/lib/pm-utils/sleep.d/99_external_monitor_wake
sudo chmod +x /usr/lib/pm-utils/sleep.d/99_external_monitor_wake
USERNAME
您想用在以下位置找到的自己的登录用户名替换用户第 0.0 节。多于。
3. 创建一个 systemd 服务单元文件,以/etc/systemd/system/wake-monitor.service
在从睡眠状态恢复时触发此脚本:
[Unit]
Description=Wake external monitor connected to HDMI after resuming from sleep, and when entering a display manager
After=sleep.target display-manager.service
StopWhenUnneeded=yes
[Service]
User=USERNAME
Type=oneshot
RemainAfterExit=no
ExecStart=/usr/lib/pm-utils/sleep.d/99_external_monitor_wake resume
[Install]
WantedBy=sleep.target display-manager.service
USERNAME
您想用在以下位置找到的自己的登录用户名替换用户第 0.0 节。多于。
我将 添加display-manager.service
到我的After
和中WantedBy
,因为我在屏幕无活动后锁定时也遇到了同样的问题。如果您只需要修复从睡眠状态恢复的问题,则可以将其删除。
4.启用新创建的 systemd 服务:
sudo systemctl daemon-reload
sudo systemctl enable wake-monitor.service
就这样!您应该能够暂停计算机,然后唤醒并运行外部显示器!
如果某些事情出现问题,您可以通过运行sudo systemctl status wake-monitor.service
并查看输出来调试服务。
参考:
答案2
可以尝试以下两件事:
有时xrandr
不带选项运行就会导致显示器被探测并开始工作。
我在省电模式下遇到过问题,一个屏幕可以唤醒,而另一个屏幕却无法唤醒,尤其是当其中一个屏幕断开连接一段时间后。发生这种情况时,请确保外接显示器已插入并打开电源,然后运行
xset dpms force off
等待几秒钟,然后按任意键取消屏幕空白。这可能会唤醒外接显示器。
可能需要完全循环,并且需要延迟以让事情稳定下来:
xset dpms force off; sleep 2; xset dpms force on
自动等待可能不起作用,手动观察可能更有效。如果显示器在蓝屏/黑屏等状态之间交替,您可能需要在显示器处于这些状态之一时运行命令(例如当它是黑屏而不是蓝屏时)。