udev rules.d-热插拔 HDMI 显示器-脚本未运行

udev rules.d-热插拔 HDMI 显示器-脚本未运行

我试图让一个脚本在每次插入 HDMI 显示器时运行,在阅读了一些资料后,我发现其中要求我创建 99-monitor-hotplug.rules 并将其放入/etc/udev/rules.d并指定要运行哪个脚本。规则如下:

ACTION=="change", SUBSYSTEM=="drm", ENV{HOTPLUG}=="1", RUN+="/root/hotplug.sh"

好吧,我这样做了,但脚本没有运行。我知道这一点,因为在脚本中我只有:

#!/bin/bash
opera

我故意把脚本写得这么简单,这样我就能看清发生了什么。当我从命令行调用脚本时,Opera 确实运行了。

以下是当我插入和拔出 HDMI 显示器时发生的情况“udevadm 监视器--属性“ 在跑:

monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent

KERNEL[730.834194] change   /devices/pci0000:00/0000:00:01.0/0000:01:00.0/drm/card1 (drm)
ACTION=change
DEVNAME=/dev/dri/card1
DEVPATH=/devices/pci0000:00/0000:00:01.0/0000:01:00.0/drm/card1
DEVTYPE=drm_minor
HOTPLUG=1
MAJOR=226
MINOR=1
SEQNUM=3245
SUBSYSTEM=drm

UDEV  [730.835499] change   /devices/pci0000:00/0000:00:01.0/0000:01:00.0/drm/card1 (drm)
ACTION=change
DEVNAME=/dev/dri/card1
DEVPATH=/devices/pci0000:00/0000:00:01.0/0000:01:00.0/drm/card1
DEVTYPE=drm_minor
HOTPLUG=1
ID_FOR_SEAT=drm-pci-0000_01_00_0
ID_PATH=pci-0000:01:00.0
ID_PATH_TAG=pci-0000_01_00_0
MAJOR=226
MINOR=1
SEQNUM=3245
SUBSYSTEM=drm
TAGS=:seat:uaccess:master-of-seat:
USEC_INITIALIZED=3217504

KERNEL[738.204082] change   /devices/pci0000:00/0000:00:01.0/0000:01:00.0/drm/card1 (drm)
ACTION=change
DEVNAME=/dev/dri/card1
DEVPATH=/devices/pci0000:00/0000:00:01.0/0000:01:00.0/drm/card1
DEVTYPE=drm_minor
HOTPLUG=1
MAJOR=226
MINOR=1
SEQNUM=3246
SUBSYSTEM=drm

UDEV  [738.206107] change   /devices/pci0000:00/0000:00:01.0/0000:01:00.0/drm/card1 (drm)
ACTION=change
DEVNAME=/dev/dri/card1
DEVPATH=/devices/pci0000:00/0000:00:01.0/0000:01:00.0/drm/card1
DEVTYPE=drm_minor
HOTPLUG=1
ID_FOR_SEAT=drm-pci-0000_01_00_0
ID_PATH=pci-0000:01:00.0
ID_PATH_TAG=pci-0000_01_00_0
MAJOR=226
MINOR=1
SEQNUM=3246
SUBSYSTEM=drm
TAGS=:seat:uaccess:master-of-seat:
USEC_INITIALIZED=3217504

添加规则后,我运行了:sudo udevadm control--reload-rules

有人能帮忙吗?我觉得规则可能不正确,而且我是 udev 规则创建新手。我正在运行 Ubuntu 16.04。

答案1

opera?哦不!RUN仅适用于短时间运行的任务,udev 在受限环境中运行命令。

不支持 GUI,守护进程在完成事件处理后将被终止。

如果您只想测试规则是否被触发,请尝试以下操作:

#!/bin/bash
date >> /root/myrule.log

参考:man udev

运行{类型}

这只能用于运行时间非常短的前台任务。长时间运行事件进程可能会阻止此设备或相关设备的所有后续事件。

启动守护进程或其他长时间运行的进程对于 udev 来说是不合适的;分叉的进程,无论是否分离,都会在事件处理完成后被无条件终止。

答案2

user.dz 的回答仅第一次对我有用。这种方法每次都对我有用:

KERNEL=="card0", SUBSYSTEM=="drm", ACTION=="change", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/marco/.Xauthority", RUN+="/bin/bash /root/hdmi_hotplug.sh"

相关内容