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

Dav*_*rks 9 display nvidia multiple-monitors suspend

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

穷人的解决方案:
我发现让外部显示器工作的唯一方法(除了重新启动)是从连接显示器切换到镜像显示器。一旦显示器启动,我就可以简单地取消对镜像显示的更改,显示器设置恢复,并且外部显示器照常工作。

申诉:
不幸的是,这会导致我的外部显示器上的窗口在桌面工作区中排列错误(这里是 PopOS,Ubuntu 20.10)。在镜像/取消过程之后重新安排工作区需要花费相当多的精力。

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

小智 7

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

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
Run Code Online (Sandbox Code Playgroud)

您需要根据您的设置调整此脚本。

首先要改变的是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(我知道我不是 EMT):先摇晃它,然后在它处于能够接收的状态时潜入第二个命令。

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
Run Code Online (Sandbox Code Playgroud)

您想要将用户替换USERNAME为您自己的登录用户名(在0.0.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
Run Code Online (Sandbox Code Playgroud)

您想要将用户替换USERNAME为您自己的登录用户名(在0.0.0.0 节中找到)。多于。

我包含display-manager.service在我的After和中WantedBy,因为当屏幕在没有活动后锁定时我遇到了同样的问题。如果您只需要修复从睡眠状态恢复的问题,则可以将其删除。

4.启用新创建的systemd服务:

[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
Run Code Online (Sandbox Code Playgroud)

就是这样!您应该能够挂起计算机,并在外部显示器正常工作的情况下醒来!

如果出现问题,您可以通过运行sudo systemctl status wake-monitor.service并查看输出来调试服务。

参考:


use*_*489 4

有两件事要尝试:

有时,不带任何选项运行xrandr会导致显示屏被探测并开始工作。

我在使用省电模式时遇到问题,无法唤醒一个屏幕而不是另一个屏幕,尤其是当一个屏幕断开连接一段时间时。发生这种情况时,请确保外接显示器已插入并通电,然后运行

xset dpms force off
Run Code Online (Sandbox Code Playgroud)

等待几秒钟,然后按一个键来取消屏幕空白。这可能会唤醒外部显示器。

可能需要将事情完全循环,并且需要延迟来让事情解决:

xset dpms force off; sleep 2; xset dpms force on
Run Code Online (Sandbox Code Playgroud)

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