เหตุใดกฎ udev นี้จึงไม่เรียกใช้เมื่อนำอุปกรณ์ออก


12

ฉันมีเมาส์สองตัวตัวหนึ่งซึ่งมีปัญหาที่ปุ่มกลางของเมาส์และ button6 ถูกทริกเกอร์พร้อมกัน ดังนั้นฉันจึงกำหนดค่า~/.Xmodmapให้ปิดใช้งานปุ่มนี้ อย่างไรก็ตามในเวลาเดียวกันฉันต้องการที่จะยังคงสามารถใช้ปุ่มนี้กับเมาส์ตัวอื่นของฉันได้ ดังนั้นฉันจึงเขียนudevกฎที่เรียกว่าxmodmapเปลี่ยนเค้าโครงปุ่มขึ้นอยู่กับเมาส์ที่เชื่อมต่อ


ติดตั้ง

นี่คือการตั้งค่าปัจจุบันของฉัน:

/etc/udev/rules.d/logitech-g7.rules :

# deactivate MB 6 when mouse 1 is connected
ACTION=="add", ENV{DEVTYPE}=="usb_device", ENV{ID_VENDOR_ID}=="046d", ENV{ID_MODEL_ID}=="c51a", RUN+="/home/user/.scripts/Troubleshooting/Bugfixes/mouseswitcher_wrapper 1", OWNER="user"
# restore defaults when mouse 1 is disconnected
ACTION=="remove", ENV{DEVTYPE}=="usb_device", ENV{ID_VENDOR_ID}=="046d", ENV{ID_MODEL_ID}=="c51a", RUN+="/home/user/.scripts/Troubleshooting/Bugfixes/mouseswitcher_wrapper 0", OWNER="user"

/home/user/.scripts/Troubleshooting/Bugfixes/mouseswitcher_wrapper :

#!/bin/bash
/home/user/.scripts/Troubleshooting/Bugfixes/mouseswitcher "$1"&

/home/user/.scripts/Troubleshooting/Bugfixes/mouseswitcher

#!/bin/bash
sleep 1
DISPLAY=":0.0"
HOME=/home/user/
XAUTHORITY=$HOME/.Xauthority
export DISPLAY XAUTHORITY HOME

if [[ "$1" == 1 ]] #differentiate between ADD (1) event and REMOVE (0) event
  then
      /usr/bin/xmodmap /home/user/.XmodmapG7 > /dev/null 2>&1
  else
      /usr/bin/xmodmap /home/user/.Xmodmap > /dev/null 2>&1
fi

หากตะเข็บค่อนข้างซับซ้อนเพียงเพราะฉันสะดุดปัญหาหลายอย่างที่มี udev, xmodmap และตัวแปร DISPLAY สคริปต์ของฉันอ้างอิงจากคำถาม & คำตอบนี้


สถานะปัจจุบัน

การกระทำ ADD ทำงานได้ดีการดำเนินการ REMOVE ไม่ทำงาน การดำเนินการคำสั่ง RUN อย่างใดอย่างหนึ่งด้วยตนเองในเทอร์มินัลก็ทำงานได้ดี


สิ่งที่ฉันได้ลองมาแล้ว

ฉันพบโพสต์ในฟอรัมนี้โดยสรุปว่าทำไม udev มีปัญหากับการดำเนินการลบและแทนที่ ATTRS ด้วยตัวแปร ENV แต่ทั้งหมดนี้ไม่เกิดประโยชน์ทริกเกอร์การลบยังคงไม่ทำงาน

จะต้องมีบางสิ่งที่ฉันทำผิดไป ฉันจะขอบคุณมันจริงๆถ้ามีคนรอบ ๆ ที่นี่มีความเชี่ยวชาญใน udev และ Linux โดยทั่วไปสามารถดูกรณีของฉันได้


ข้อมูลเพิ่มเติม

เอาต์พุตของudevadm monitor --environment --udevเมื่อเสียบตัวรับใน:

######ADD#######

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

UDEV  [21728.392805] add      /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3 (usb)
ACTION=add
BUSNUM=002
DEVNAME=/dev/bus/usb/002/037
DEVNUM=037
DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3
DEVTYPE=usb_device
ID_BUS=usb
ID_MODEL=USB_Receiver
ID_MODEL_ENC=USB\x20Receiver
ID_MODEL_ID=c51a
ID_REVISION=4100
ID_SERIAL=Logitech_USB_Receiver
ID_USB_INTERFACES=:030102:030000:
ID_VENDOR=Logitech
ID_VENDOR_ENC=Logitech
ID_VENDOR_ID=046d
MAJOR=189
MINOR=164
PRODUCT=46d/c51a/4100
SEQNUM=3139
SUBSYSTEM=usb
TYPE=0/0/0
UDEV_LOG=3
UPOWER_VENDOR=Logitech, Inc.
USEC_INITIALIZED=21727880859

UDEV  [21728.393864] add      /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.0 (usb)
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.0
DEVTYPE=usb_interface
INTERFACE=3/1/2
MODALIAS=usb:v046DpC51Ad4100dc00dsc00dp00ic03isc01ip02in00
PRODUCT=46d/c51a/4100
SEQNUM=3140
SUBSYSTEM=usb
TYPE=0/0/0
UDEV_LOG=3
USEC_INITIALIZED=21728393779

UDEV  [21728.395536] add      /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.1 (usb)
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.1
DEVTYPE=usb_interface
INTERFACE=3/0/0
MODALIAS=usb:v046DpC51Ad4100dc00dsc00dp00ic03isc00ip00in01
PRODUCT=46d/c51a/4100
SEQNUM=3146
SUBSYSTEM=usb
TYPE=0/0/0
UDEV_LOG=3
USEC_INITIALIZED=21728395426

UDEV  [21728.395737] add      /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.0/0003:046D:C51A.004B (hid)
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.0/0003:046D:C51A.004B
HID_ID=0003:0000046D:0000C51A
HID_NAME=Logitech USB Receiver
HID_PHYS=usb-0000:00:1d.0-1.3/input0
MODALIAS=hid:b0003g0001v0000046Dp0000C51A
SEQNUM=3141
SUBSYSTEM=hid
UDEV_LOG=3
USEC_INITIALIZED=21728395467

UDEV  [21728.398102] add      /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.1/0003:046D:C51A.004C (hid)
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.1/0003:046D:C51A.004C
HID_ID=0003:0000046D:0000C51A
HID_NAME=Logitech USB Receiver
HID_PHYS=usb-0000:00:1d.0-1.3/input1
MODALIAS=hid:b0003g0001v0000046Dp0000C51A
SEQNUM=3147
SUBSYSTEM=hid
UDEV_LOG=3
USEC_INITIALIZED=21728397927

UDEV  [21728.398650] add      /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.0/0003:046D:C51A.004B/hidraw/hidraw2 (hidraw)
ACTION=add
DEVNAME=/dev/hidraw2
DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.0/0003:046D:C51A.004B/hidraw/hidraw2
MAJOR=251
MINOR=2
SEQNUM=3145
SUBSYSTEM=hidraw
UDEV_LOG=3
USEC_INITIALIZED=21728398188

UDEV  [21728.399406] add      /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.1/0003:046D:C51A.004C/hidraw/hidraw3 (hidraw)
ACTION=add
DEVNAME=/dev/hidraw3
DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.1/0003:046D:C51A.004C/hidraw/hidraw3
MAJOR=251
MINOR=3
SEQNUM=3151
SUBSYSTEM=hidraw
UDEV_LOG=3
USEC_INITIALIZED=21728399273

UDEV  [21728.400119] add      /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.1/usbmisc/hiddev1 (usbmisc)
ACTION=add
DEVNAME=/dev/usb/hiddev1
DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.1/usbmisc/hiddev1
MAJOR=180
MINOR=1
SEQNUM=3150
SUBSYSTEM=usbmisc
UDEV_LOG=3
USEC_INITIALIZED=21727874845

UDEV  [21728.401438] add      /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.0/input/input73 (input)
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.0/input/input73
EV=17
ID_BUS=usb
ID_INPUT=1
ID_INPUT_MOUSE=1
ID_MODEL=USB_Receiver
ID_MODEL_ENC=USB\x20Receiver
ID_MODEL_ID=c51a
ID_PATH=pci-0000:00:1d.0-usb-0:1.3:1.0
ID_PATH_TAG=pci-0000_00_1d_0-usb-0_1_3_1_0
ID_REVISION=4100
ID_SERIAL=Logitech_USB_Receiver
ID_TYPE=hid
ID_USB_DRIVER=usbhid
ID_USB_INTERFACES=:030102:030000:
ID_USB_INTERFACE_NUM=00
ID_VENDOR=Logitech
ID_VENDOR_ENC=Logitech
ID_VENDOR_ID=046d
KEY=ffff0000 0 0 0 0
MODALIAS=input:b0003v046DpC51Ae0111-e0,1,2,4,k110,111,112,113,114,115,116,117,118,119,11A,11B,11C,11D,11E,11F,r0,1,6,8,am4,lsfw
MSC=10
NAME="Logitech USB Receiver"
PHYS="usb-0000:00:1

เอาท์พุทudevadm monitor --environment --udevเมื่อถอดผู้รับ:

#######REMOVE#######


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

UDEV  [21800.789239] remove   /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.0/input/input75/mouse1 (input)
ACTION=remove
DEVLINKS=/dev/input/by-id/usb-Logitech_USB_Receiver-mouse /dev/input/by-path/pci-0000:00:1d.0-usb-0:1.3:1.0-mouse
DEVNAME=/dev/input/mouse1
DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.0/input/input75/mouse1
ID_BUS=usb
ID_INPUT=1
ID_INPUT_MOUSE=1
ID_MODEL=USB_Receiver
ID_MODEL_ENC=USB\x20Receiver
ID_MODEL_ID=c51a
ID_PATH=pci-0000:00:1d.0-usb-0:1.3:1.0
ID_PATH_TAG=pci-0000_00_1d_0-usb-0_1_3_1_0
ID_REVISION=4100
ID_SERIAL=Logitech_USB_Receiver
ID_TYPE=hid
ID_USB_DRIVER=usbhid
ID_USB_INTERFACES=:030102:030000:
ID_USB_INTERFACE_NUM=00
ID_VENDOR=Logitech
ID_VENDOR_ENC=Logitech
ID_VENDOR_ID=046d
MAJOR=13
MINOR=33
SEQNUM=3178
SUBSYSTEM=input
UDEV_LOG=3
USEC_INITIALIZED=21797014959

UDEV  [21800.792866] remove   /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.0/input/input75/event6 (input)
ACTION=remove
DEVLINKS=/dev/input/by-id/usb-Logitech_USB_Receiver-event-mouse /dev/input/by-path/pci-0000:00:1d.0-usb-0:1.3:1.0-event-mouse
DEVNAME=/dev/input/event6
DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.0/input/input75/event6
ID_BUS=usb
ID_INPUT=1
ID_INPUT_MOUSE=1
ID_MODEL=USB_Receiver
ID_MODEL_ENC=USB\x20Receiver
ID_MODEL_ID=c51a
ID_PATH=pci-0000:00:1d.0-usb-0:1.3:1.0
ID_PATH_TAG=pci-0000_00_1d_0-usb-0_1_3_1_0
ID_REVISION=4100
ID_SERIAL=Logitech_USB_Receiver
ID_TYPE=hid
ID_USB_DRIVER=usbhid
ID_USB_INTERFACES=:030102:030000:
ID_USB_INTERFACE_NUM=00
ID_VENDOR=Logitech
ID_VENDOR_ENC=Logitech
ID_VENDOR_ID=046d
MAJOR=13
MINOR=70
SEQNUM=3179
SUBSYSTEM=input
UDEV_LOG=3
USEC_INITIALIZED=21797013896

UDEV  [21800.797061] remove   /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.0/input/input75 (input)
ACTION=remove
DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.0/input/input75
EV=17
ID_BUS=usb
ID_INPUT=1
ID_INPUT_MOUSE=1
ID_MODEL=USB_Receiver
ID_MODEL_ENC=USB\x20Receiver
ID_MODEL_ID=c51a
ID_PATH=pci-0000:00:1d.0-usb-0:1.3:1.0
ID_PATH_TAG=pci-0000_00_1d_0-usb-0_1_3_1_0
ID_REVISION=4100
ID_SERIAL=Logitech_USB_Receiver
ID_TYPE=hid
ID_USB_DRIVER=usbhid
ID_USB_INTERFACES=:030102:030000:
ID_USB_INTERFACE_NUM=00
ID_VENDOR=Logitech
ID_VENDOR_ENC=Logitech
ID_VENDOR_ID=046d
KEY=ffff0000 0 0 0 0 0 0 0 0
MODALIAS=input:b0003v046DpC51Ae0111-e0,1,2,4,k110,111,112,113,114,115,116,117,118,119,11A,11B,11C,11D,11E,11F,r0,1,6,8,am4,lsfw
MSC=10
NAME="Logitech USB Receiver"
PHYS="usb-0000:00:1d.0-1.3/input0"
PRODUCT=3/46d/c51a/111
PROP=0
REL=143
SEQNUM=3180
SUBSYSTEM=input
UDEV_LOG=3
UNIQ=""
USEC_INITIALIZED=21796479085

UDEV  [21800.797132] remove   /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.0/0003:046D:C51A.004D/hidraw/hidraw2 (hidraw)
ACTION=remove
DEVNAME=/dev/hidraw2
DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.0/0003:046D:C51A.004D/hidraw/hidraw2
MAJOR=251
MINOR=2
SEQNUM=3181
SUBSYSTEM=hidraw
UDEV_LOG=3
USEC_INITIALIZED=21800796369

UDEV  [21800.797172] remove   /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.0/0003:046D:C51A.004D (hid)
ACTION=remove
DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.0/0003:046D:C51A.004D
HID_ID=0003:0000046D:0000C51A
HID_NAME=Logitech USB Receiver
HID_PHYS=usb-0000:00:1d.0-1.3/input0
MODALIAS=hid:b0003g0001v0000046Dp0000C51A
SEQNUM=3182
SUBSYSTEM=hid
UDEV_LOG=3
USEC_INITIALIZED=21800796501

UDEV  [21800.798537] remove   /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.0 (usb)
ACTION=remove
DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.0
DEVTYPE=usb_interface
INTERFACE=3/1/2
MODALIAS=usb:v046DpC51Ad4100dc00dsc00dp00ic03isc01ip02in00
PRODUCT=46d/c51a/4100
SEQNUM=3183
SUBSYSTEM=usb
TYPE=0/0/0
UDEV_LOG=3
USEC_INITIALIZED=21800796538

UDEV  [21800.814181] remove   /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.1/input/input76/event7 (input)
ACTION=remove
DEVLINKS=/dev/input/by-id/usb-Logitech_USB_Receiver-event-if01 /dev/input/by-path/pci-0000:00:1d.0-usb-0:1.3:1.1-event
DEVNAME=/dev/input/event7
DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.1/input/input76/event7
ID_BUS=usb
ID_INPUT=1
ID_INPUT_KEY=1
ID_MODEL=USB_Receiver
ID_MODEL_ENC=USB\x20Receiver
ID_MODEL_ID=c51a
ID_PATH=pci-0000:00:1d.0-usb-0:1.3:1.1
ID_PATH_TAG=pci-0000_00_1d_0-usb-0_1_3_1_1
ID_REVISION=4100
ID_SERIAL=Logitech_USB_Receiver
ID_TYPE=hid
ID_USB_DRIVER=usbhid
ID_USB_INTERFACES=:030102:030000:
ID_USB_INTERFACE_NUM=01
ID_VENDOR=Logitech
ID_VENDOR_ENC=Logitech
ID_VENDOR_ID=046d
MAJOR=13
MINOR=71
SEQNUM=3184
SUBSYSTEM=input
UDEV_LOG=3
USEC_INITIALIZED=21797013933
XKBLAYOUT=de
XKBMODEL=pc105

UDEV  [21800.816765] remove   /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.1/input/input76 (input)
ABS=1 0
ACTION=remove
DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.1/input/input76
EV=1f
ID_BUS=usb
ID_INPUT=1
ID_INPUT_KEY=1
ID_MODEL=USB_Receiver
ID_MODEL_ENC=USB\x20Receiver
ID_MODEL_ID=c51a
ID_PATH=pci-0000:00:1d.0-usb-0:1.3:1.1
ID_PATH_TAG=pci-0000_00_1d_0-usb-0_1_3_1_1
ID_REVISION=4100
ID_SERIAL=Logitech_USB_Receiver
ID_TYPE=hid
ID_USB_DRIVER=usbhid
ID_USB_INTERFACES=:030102:030000:
ID_USB_INTERFACE_NUM=01
ID_VENDOR=Logitech
ID_VENDOR_ENC=Logitech
ID_VENDOR_ID=046d
KEY=4837fff 72ff32d bf544446 0 0 1 20f90 8b17c000 677bfa d9415fed 9ed680 4400 0 10000002
MODALIAS=input:b0003v046DpC51Ae0111-e0,1,2,3,4,k71,72,73,74,77,80,82,83,85,86,87,88,89,8A,8B,8C,8E,90,96,98,9B,9C,9E,9F,A1,A3,A4,A5,A6,A7,A8,A9,AB,AC,AD,AE,B0,B1,B2,B5,B6,CE,CF,D0,D1,D2,D4,D8,D9,DB,DF,E4,E7,E8,E9,EA,EB,F1,100,161,162,166,16A,16E,172,174,176,178,179,17A,17B,17C,17D,17F,180,182,183,185,188,189,18C,18D,18E,18F,190,191,192,193,195,198,199,19A,1A0,1A1,1A2,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA,1AB,1AC,1AD,1AE,1B0,1B1,1B7,1BA,r6,a20,m4,lsfw
MSC=10
NAME="Logitech USB Receiver"
PHYS="usb-0000:00:1d.0-1.3/input1"
PRODUCT=3/46d/c51a/111
PROP=0
REL=40
SEQNUM=3185
SUBSYSTEM=input
UDEV_LOG=3
UNIQ=""
USEC_INITIALIZED=21796482192

UDEV  [21800.817249] remove   /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.1/usbmisc/hiddev1 (usbmisc)
ACTION=remove
DEVNAME=/dev/usb/hiddev1
DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.1/usbmisc/hiddev1
MAJOR=180
MINOR=1
SEQNUM=3186
SUBSYSTEM=usbmisc
UDEV_LOG=3
USEC_INITIALIZED=21800816392

UDEV  [21800.818490] remove   /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.1/0003:046D:C51A.004E/hidraw/hidraw3 (hidraw)
ACTION=remove
DEVNAME=/dev/hidraw3
DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.1/0003:046D:C51A.004E/hidraw/hidraw3
MAJOR=251
MINOR=3
SEQNUM=3187
SUBSYSTEM=hidraw
UDEV_LOG=3
USEC_INITIALIZED=21800816472

UDEV  [21800.818536] remove   /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.1/0003:046D:C51A.004E (hid)
ACTION=remove
DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.1/0003:046D:C51A.004E
HID_ID=0003:0000046D:0000C51A
HID_NAME=Logitech USB Receiver
HID_PHYS=usb-0000:00:1d.0-1.3/input1
MODALIAS=hid:b0003g0001v0000046Dp0000C51A
SEQNUM=3188
SUBSYSTEM=hid
UDEV_LOG=3
USEC_INITIALIZED=21800816908

UDEV  [21800.818580] remove   /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.1 (usb)
ACTION=remove
DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.1
DEVTYPE=usb_interface
INTERFACE=3/0/0
MODALIAS=usb:v046DpC51Ad4100dc00dsc00dp00ic03isc00ip00in01
PRODUCT=46d/c51a/4100
SEQNUM=3189
SUBSYSTEM=usb
TYPE=0/0/0
UDEV_LOG=3
USEC_INITIALIZED=21800816945

UDEV  [21800.818645] remove   /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3 (usb)
ACTION=remove
BUSNUM=002
DEVNAME=/dev/bus/usb/002/038
DEVNUM=038
DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3
DEVTYPE=usb_device
ID_BUS=usb
ID_MODEL=USB_Receiver
ID_MODEL_ENC=USB\x20Receiver
ID_MODEL_ID=c51a
ID_REVISION=4100
ID_SERIAL=Logitech_USB_Receiver
ID_USB_INTERFACES=:030102:030000:
ID_VENDOR=Logitech
ID_VENDOR_ENC=Logitech
ID_VENDOR_ID=046d
MAJOR=189
MINOR=165
PRODUCT=46d/c51a/4100
SEQNUM=3190
SUBSYSTEM=usb
TYPE=0/0/0
UDEV_LOG=3
UPOWER_VENDOR=Logitech, Inc.
USEC_INITIALIZED=21796488421

1
คุณสามารถตรวจสอบว่ากฎของคุณตรงกับอุปกรณ์และเหตุการณ์การนำออกหรือไม่ฉันไม่สามารถยืนยันสิ่งนี้ได้จากเอาต์พุตของจอภาพ คุณสามารถดูว่าพวกเขาจะจับคู่ usinng:udevadm test --action=add $(udevadm info --query=path -n /dev/input/mouse0)
zorlem

@zorlem ขอบคุณสำหรับความคิดเห็นของคุณ คำถามของฉันได้ตีขีด จำกัด อักขระดังนั้นนี่คือPastebin ของผลผลิต ด้วยความเข้าใจที่ จำกัด ของฉันฉันคิดว่าฉันเห็นว่ากฎไม่ได้นำไปใช้ คุณมีความคิดว่าทำไมถึงเป็นเช่นนั้น?
Glutanimate

คำตอบ:


13

ทางเลือกการแก้ปัญหา

หลังจากเขียนคำตอบให้จบฉันก็ตระหนักว่าสิ่งที่คุณพยายามจะทำให้สำเร็จนั้นสามารถทำได้อย่างสวยงามมากขึ้นด้วยความช่วยเหลือxinputหรือแม้กระทั่งการใช้ config ของ Xorg ให้แน่ใจว่าจะอ่านเอกสารเกี่ยวกับการควบคุมอุปกรณ์ป้อนข้อมูลใน Xorg

ใช้ udev (ตอบคำถามของคุณ)

จากการทดสอบของฉันมีสองปัญหาเกี่ยวกับกฎของคุณ:

  1. อย่างน้อยใน Ubuntu GNU / Linux 12.04 ของฉันจะไม่มีการตรวจสอบENV{DEVTYPE}ที่ตรงกันเลย (แม้ว่าจะมีการรายงานอย่างถูกต้องโดยudevadm infoและudevadm monitor) นี่คือเหตุผลที่คุณไม่เห็นการaddจับคู่กฎ
  2. คุณควรลบการOWNERบ้านออกจากremoveกฎ มันไม่สมเหตุสมผลและ udev ก็เพิกเฉยต่อกฎโดยสิ้นเชิง

โปรดลองด้วยสองกฎต่อไปนี้และดูว่าพวกเขาแก้ปัญหาได้หรือไม่

ACTION=="add", ENV{ID_MODEL}=="USB_Receiver", ENV{ID_VENDOR_ID}=="046d", ENV{ID_MODEL_ID}=="c51a", RUN+="/home/user/.scripts/Troubleshooting/Bugfixes/mouseswitcher_wrapper 1", OWNER="user"
ACTION=="remove", ENV{ID_MODEL}=="USB_Receiver", ENV{ID_VENDOR_ID}=="046d", ENV{ID_MODEL_ID}=="c51a", RUN+="/home/user/.scripts/Troubleshooting/Bugfixes/mouseswitcher_wrapper 0"

ข้อควรพิจารณาเพิ่มเติม

หลายสิ่งที่ควรพิจารณา:

  1. มันใช้งานได้ง่ายกว่าATTR{idVendor}และATTR{idProduct}สำหรับการจัดหมวดหมู่ของอุปกรณ์ คุณสามารถเปลี่ยนaddกฎเพื่อใช้งานได้อย่างปลอดภัยแทนENVแต่ฉันปล่อยให้เป็นแบบนี้เพื่อความเรียบง่าย ปัจจุบันaddและremoveกฎเกือบจะเหมือนกัน
  2. พิจารณาถึงผลกระทบด้านความปลอดภัยของการเรียกใช้สคริปต์ในฐานะรูทในไดเรกทอรีที่ผู้ใช้รายอื่นเขียนได้ ในกรณีเฉพาะของคุณไม่ใช่ปัญหาร้ายแรง แต่ฉันจะไม่เรียกมันว่าเป็นการปฏิบัติด้านความปลอดภัยที่ดี IMO มันจะดีมากวางสคริปต์ใน / usr / local / bin / ทำให้มันเป็นเจ้าของโดยroot.rootและโหมด0755
  3. ตรวจสอบให้แน่ใจว่าคุณต้องการให้อุปกรณ์เมาส์เป็นเจ้าของโดยผู้ใช้ของคุณไม่จำเป็นต้องทำเช่นนั้น PolicyKit และ Xorg ควรจะสามารถจัดการอุปกรณ์ที่เป็นเจ้าของรูทได้โดยไม่มีปัญหาใด ๆ

หากคุณไม่จำเป็นต้องเปลี่ยนเจ้าของอุปกรณ์และการตั้งค่าของคุณทำงานกับอุปกรณ์ที่เป็นเจ้าของรูทคุณสามารถทำให้กฎ udev ทั้งสองของคุณเป็นกฎนี้ได้ง่ายขึ้น:

ACTION=="add|remove", ENV{ID_MODEL}=="USB_Receiver", ENV{ID_VENDOR_ID}=="046d", ENV{ID_MODEL_ID}=="c51a", RUN+="/home/user/.scripts/Troubleshooting/Bugfixes/mouseswitcher_wrapper $env{ACTION}"

สิ่งนี้จะเรียกสคริปต์ของคุณด้วยการกระทำที่สอดคล้องกัน - removeหรือaddดังนั้นคุณจะต้องแก้ไขสคริปต์ของคุณเพื่อจัดการกับข้อโต้แย้งเหล่านี้

เพื่อป้องกันไม่ให้กฎจับคู่ (และสคริปต์ทำงาน) มากกว่าหนึ่งครั้งคุณต้องทำให้กฎเฉพาะเจาะจงมากขึ้น: กฎนั้นตรงกับ "อินพุต" (ปุ่มและอื่น ๆ ) ของเมาส์แต่ละตัว นั่นเป็นเหตุผลที่มันถูกดำเนินการซ้ำ ๆ ลองเพิ่มENV{ID_TYPE}!="hid"หรือENV{ID_USB_DRIVER}!="*hid*"และดูว่ามันทำงานเป็นมีเพียงหนึ่งอุปกรณ์ที่ไม่ได้ HID - usb_deviceด้านบน

PS: ถ้าคุณต้องการทำให้mouseswitcherสคริปต์ของคุณมีความยืดหยุ่นมากขึ้นและใช้ระบบกับ ConsoleKit คุณสามารถใช้ck-list-sessionsเพื่อรับผู้ใช้ที่เข้าสู่ระบบในปัจจุบันและใช้ข้อมูลนั้นเพื่อตั้งค่าXAUTHORITYตัวแปร


ขอบคุณสำหรับคำตอบที่ยอดเยี่ยมนี้! กฎ udev ที่รวมกันนั้นทำงานได้อย่างสมบูรณ์แบบโดยไม่ต้องมีการกำหนด OWNER ซึ่งฉันคิดว่าโปสเตอร์ดั้งเดิมได้ตั้งค่าเพื่อแก้ไขข้อผิดพลาดกับตัวแปรสภาพแวดล้อม ฉันยังสามารถปรับปรุงการตั้งค่าโดยการลบสคริปต์ของ wrapper (เพื่อบอกความจริงฉันไม่แน่ใจว่าทำไม OP เพิ่มในตอนแรก) ปัญหาเดียวที่เหลือคือสคริปต์ถูกเรียกหลายครั้งเมื่อทำการลบหรือเชื่อมต่อเมาส์ นี่คือการส่งออก syslog กับชุดระดับการบันทึก udev infoไป
Glutanimate

คุณนึกถึงวิธีใดบ้างที่ฉันสามารถระบุกฎเพิ่มเติมเพื่อให้สามารถดำเนินการได้เพียงครั้งเดียว นอกจากนี้ขอขอบคุณสำหรับคำแนะนำในการวางสคริปต์ ฉันไม่ได้ตระหนักถึงปัญหาด้านความปลอดภัย ฉันจะพิจารณาเรื่องนี้อย่างแน่นอนตั้งแต่นี้ไป!
Glutanimate

1
ลองเพิ่มENV{ID_TYPE}!="hid"หรือENV{ID_USB_DRIVER}!="*hid*"ดูว่าใช้งานได้หรือไม่
zorlem

ใช่นั่นแหล่ะ ENV{ID_TYPE}!="hid"ทำงานได้ดี ขอขอบคุณ!
Glutanimate

หนึ่งในคำตอบที่หายากudevที่นอกเหนือจากการพูดว่า "เพียงเพิ่มENV{DEVTYPE}=="usb_device"กฎของคุณ" แต่ยังอธิบายว่าทำไม ขอขอบคุณ!
Dmitry Grigoryev

2

ไม่กี่ปีที่ผ่านมาตั้งแต่เขียนคำตอบก่อนหน้านี้ ปรากฏว่าตั้งแต่นั้นมา udev ได้เปลี่ยนไปดังนั้น udev solution จะไม่ทำงานอีกต่อไปอย่างน้อยสำหรับ Ubuntu 18.04 ที่มี udev package เวอร์ชั่น 237-3ubuntu10.29 ฉันโพสต์คำตอบนี้เพื่อประโยชน์ของผู้คนที่ประสบปัญหานี้ในอนาคตเนื่องจากฉันไม่พบรายงานอื่น ๆ ของปัญหานี้

ด้วย udev รุ่นนี้ENV{ID_VENDOR_ID} ENV{ID_MODEL_ID}ไม่ได้ถูกตั้งค่าสำหรับการลบเหตุการณ์ดังนั้นกฎจะไม่ตรงกับตัวแปรเหล่านี้ วิธีแก้ปัญหาคือใช้ENV{PRODUCT}ซึ่งถูกตั้งค่าสำหรับทั้งเพิ่มและลบเหตุการณ์ ENV{PRODUCT}มีแบบฟอร์มidVendor/idProduct/bcdDeviceดังนั้นจึงสามารถจับคู่กับกฎที่มี:

ENV{PRODUCT}=="xxxx/yyyy*"

ที่xxxxเป็นรหัสผู้ขายและyyyyเป็นรหัสผลิตภัณฑ์ของอุปกรณ์ของคุณ

หมายเหตุด้านข้างเมื่อเปรียบเทียบกับเวลาของคำตอบก่อนหน้านี้คือ udev ตั้งค่าไว้ENV{DEVTYPE}อย่างถูกต้องและสามารถจับคู่ในกฎได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.