내 파이에 연결된 통합 USB 허브(및 물리적 전원 스위치)가 있는 모니터가 있고 모니터를 켜고 끌 때 두 가지 다른 스크립트를 실행하고 싶습니다.
디스플레이의 첫 번째 부분을 열면 제대로 작동하지만 디스플레이를 다시 닫으면 아무 것도 트리거되지 않습니다. 다른 포럼 게시물을 기반으로 이 규칙을 다양하게 변형해 보았으나 성공하지 못했습니다.
규칙 파일 /etc/udev/rules.d
(세 가지 변형 모두 포함)
SUBSYSTEM=="usb", ACTION=="add", ATTR{idProduct}=="2514", ATTR{idVendor}=="03f0", RUN+="/home/pi/monitor_on.sh"
SUBSYSTEM=="usb", ACTION=="remove", ATTR{idProduct}=="2514", ATTR{idVendor}=="03f0", RUN+="/home/pi/monitor_off.sh"
SUBSYSTEM=="usb", ACTION=="remove", ENV{ID_MODEL}=="2514", ENV{ID_VENDOR}=="03f0", RUN+="/home/pi/monitor_off.sh"
SUBSYSTEM=="usb", ACTION=="remove", ENV{idProduct}=="2514", ENV{idVendor}=="03f0", RUN+="/home/pi/monitor_off.sh"
테스트 결과 udevadm test
처음 두 삭제 규칙은 실행되어야 하고 세 번째 규칙은 실행되지 않는 것으로 나타났습니다.
udevadm test --action="remove" /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.4
This program is for debugging only, it does not run any program
[...]
Reading rules file: /etc/udev/rules.d/99-monitor.rules
[...]
1-1.4: RUN '/home/pi/monitor_off.sh' /etc/udev/rules.d/99-monitor.rules:2
1-1.4: RUN '/home/pi/monitor_off.sh' /etc/udev/rules.d/99-monitor.rules:3
DEVPATH=/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.4
DEVNAME=/dev/bus/usb/001/060
DEVTYPE=usb_device
DRIVER=usb
PRODUCT=3f0/2514/0
TYPE=9/0/2
BUSNUM=001
DEVNUM=060
MAJOR=189
MINOR=59
ACTION=remove
SUBSYSTEM=usb
USEC_INITIALIZED=1470318118448
ID_VENDOR=03f0
ID_VENDOR_ENC=03f0
ID_VENDOR_ID=03f0
ID_MODEL=2514
ID_MODEL_ENC=2514
ID_MODEL_ID=2514
ID_REVISION=0000
ID_SERIAL=03f0_2514
ID_BUS=usb
ID_USB_INTERFACES=:090001:090002:
ID_VENDOR_FROM_DATABASE=HP, Inc
ID_MODEL_FROM_DATABASE=4-port hub
ID_PATH=platform-fd500000.pcie-pci-0000:01:00.0-usb-0:1.4
ID_PATH_TAG=platform-fd500000_pcie-pci-0000_01_00_0-usb-0_1_4
ID_FOR_SEAT=usb-platform-fd500000_pcie-pci-0000_01_00_0-usb-0_1_4
TAGS=:seat:
run: '/home/pi/monitor_off.sh'
run: '/home/pi/monitor_off.sh'
Unload module index
Unloaded link configuration context.
그런 다음 모니터를 끄면 monitor_off.sh
스크립트가 실행되지 않습니다. daemon.log
세상에는 수많은 메시지가 있는데 어떻게 이해해야 할지 모르겠습니다. 다음은 USB 허브(1-1.4)에 관련된 내용입니다.
Sep 13 17:57:05 crumble systemd-udevd[5413]: 1-1.4: sd-device-monitor: Passed 326 byte to netlink monitor
Sep 13 17:57:05 crumble systemd-udevd[23020]: 1-1.4: Processing device (SEQNUM=3310, ACTION=unbind)
Sep 13 17:57:05 crumble systemd-udevd[23020]: 1-1.4: IMPORT builtin 'usb_id' /usr/lib/udev/rules.d/50-udev-default.rules:13
Sep 13 17:57:05 crumble systemd-udevd[23020]: 1-1.4: Failed to open USB device 'descriptors' file: No such file or directory
Sep 13 17:57:05 crumble systemd-udevd[23020]: 1-1.4: Failed to get idVendor attribute: No such file or directory
Sep 13 17:57:05 crumble systemd-udevd[23020]: 1-1.4: IMPORT builtin 'usb_id' fails: No such file or directory
Sep 13 17:57:05 crumble systemd-udevd[23020]: 1-1.4: Handling device node '/dev/bus/usb/001/060', devnum=c189:59, mode=0600, uid=0, gid=0
Sep 13 17:57:05 crumble systemd-udevd[23020]: 1-1.4: cannot stat() node '/dev/bus/usb/001/060' (No such file or directory)
Sep 13 17:57:05 crumble systemd-udevd[23020]: 1-1.4: sd-device: Created empty file '/run/udev/data/c189:59' for '/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.4'
Sep 13 17:57:05 crumble systemd-udevd[23020]: 1-1.4: Device (SEQNUM=3310, ACTION=unbind) processed
Sep 13 17:57:05 crumble systemd-udevd[23020]: 1-1.4: sd-device-monitor: Passed 326 byte to netlink monitor
Sep 13 17:57:05 crumble systemd-udevd[5413]: 1-1.4: sd-device-monitor: Passed 326 byte to netlink monitor
Sep 13 17:57:05 crumble systemd-udevd[23020]: 1-1.4: Processing device (SEQNUM=3311, ACTION=remove)
Sep 13 17:57:05 crumble systemd-udevd[23020]: 1-1.4: Device (SEQNUM=3311, ACTION=remove) processed
Sep 13 17:57:05 crumble systemd-udevd[23020]: 1-1.4: sd-device-monitor: Passed 326 byte to netlink monitor
또한 or의 반대말을 사용해 보았 ATTRS
더니 스크립트가 실행되었지만 허브에 연결된 항목에 따라 스크립트가 여러 번 실행되었습니다.ATTR
ENV
운영 체제 버전은 Raspbian Buster입니다.
답변1
이 문제는 결국 다음 규칙으로 해결되었습니다.
SUBSYSTEM=="usb", ACTION=="add", ATTR{idProduct}=="2514", ATTR{idVendor}=="03f0", RUN+="/home/pi/monitor_on.sh"
SUBSYSTEM=="usb", ACTION=="remove", ENV{DEVTYPE}=="usb_device", ENV{PRODUCT}=="3f0/2514/0", RUN+="/home/pi/monitor_off.sh"
환경 변수로 사용할 수 있는 속성은 몇 개만 있는 것 같습니다. product는 공급업체, 제품 및 기타 항목을 포함하는 속성 중 하나입니다(내 경우에는 0). USB 포트에도 동일한 제품이 설정되어 있으므로 다중 실행을 방지하려면 DEVTYPE을 추가해야 합니다.