如何让外接显示器在睡眠或关机后重新连接

如何让外接显示器在睡眠或关机后重新连接

问题:
在基于 Ubuntu 的笔记本电脑上,当我睡​​眠或断开外接显示器的电源,然后启动系统或重新连接显示器时,显示屏不会亮起。

穷人的解决方案:
我发现让外接显示器工作的唯一方法(除了重启)是从“连接显示”切换到“镜像显示”。显示器启动后,我只需取消“镜像显示”的更改,显示器设置就会恢复,外接显示器就可以正常工作了。

不满:
不幸的是,这会导致我的外接显示器上的窗口在桌面工作区中排列混乱(此处的 PopOS 是 Ubuntu 20.10)。在镜像/取消过程之后重新排列工作区需要付出相当大的努力。

充满希望的问题:
是否有任何命令行实用程序可以强制外部显示器重置,而无需从“连接显示”更改为“镜像”?

答案1

我的笔记本电脑和外接 HDMI 显示器上的 PopOS 22.04 (jammy) 也遇到了类似的问题。这是一个一旦实施就会自动生效的解决方案。

0.找出一些有用的常量:

  1. 您的用户名:这应该是不言自明的。您可以whoami在非特权 shell 终端中运行以查找。在下面的命令中,当我指定 时USERNAME,请将其替换为您的用户名。
  2. 屏幕的显示标识符:当您的显示器正常工作,您可以运行xrandr | grep ' connected'(保留引号内的空格)并查看输出。第一列包含显示标识符。例如,我的内部显示器是eDP-1,而我的外部显示器是HDMI-1-0。下面我将在我的脚本中使用这些值,如果它们不同,请将它们替换为您的值。
  3. 环境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

自动等待可能不起作用,手动观察可能更有效。如果显示器在蓝屏/黑屏等状态之间交替,您可能需要在显示器处于这些状态之一时运行命令(例如当它是黑屏而不是蓝屏时)。

相关内容