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会运行。

以下是当“ udevadm monitor –property ”运行时插入和拔出HDMI监视器时发生的情况:

 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。

歌剧? 不好了! RUN仅适用于短期运行任务,udev在受限环境中运行命令。

没有GUI支持,守护进程将在完成事件处理后被杀死。

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

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

参考: man udev

RUN {}型

这只能用于非常短时间运行的前台任务。 长时间运行事件过程可能会阻止此设备或从属设备的所有其他事件。

启动守护进程或其他长时间运行的进程不适用于udev; 事件处理完成后,将无条件地终止分离或未分离的分叉进程。

user.dz’的回答只适用于我第一次。 这种方法每次都适合我:

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