Estou tendo um monitor com um hub USB integrado (e um botão liga / desliga físico) conectado ao meu pi e desejo executar dois scripts diferentes, quando o monitor estiver ligado e desligado.
A primeira parte para ligar o monitor está funcionando bem, mas ao desligá-lo novamente nada é acionado. Com base em outras postagens do fórum, tentei diferentes variações da regra, mas não obtive sucesso.
O arquivo de regras /etc/udev/rules.d
(com todas as três variações)
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"
Testar com udevadm test
me diz que as duas primeiras regras de remoção devem ser acionadas, a terceira não.
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.
Desligar o monitor não aciona o monitor_off.sh
script. daemon.log
tem muitas mensagens, não sei como entendê-las. Abaixo estão aqueles relacionados ao hub 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
Também tentei usar ATTRS
em oposição a ATTR
ou ENV
e isso aciona o script, mas ele o aciona várias vezes, dependendo do que está conectado ao hub.
A versão do sistema operacional é raspbian buster.
Eventualmente consegui resolver com estas regras:
Parece que existem apenas alguns atributos disponíveis como variáveis de ambiente, sendo PRODUCT um deles, que contém fornecedor, produto e algo mais (0 no meu caso). A adição de DEVTYPE foi necessária para evitar múltiplas execuções, pois o mesmo PRODUCT também foi configurado para as portas USB.