首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Wacom焊盘不工作的udev规则

Wacom焊盘不工作的udev规则
EN

Unix & Linux用户
提问于 2020-03-22 13:49:02
回答 1查看 1.3K关注 0票数 3

我有以下脚本来定义我的Wacom Intuos S 2的按钮映射:

/usr/local/bin/wacom_intuos_s_2_pad_button_mapping.sh

代码语言:javascript
运行
复制
#!/bin/bash

export DISPLAY=:0
export XAUTHORITY=/home/scriptim/.Xauthority
/usr/bin/sleep 1 # wait for device to be ready
/usr/bin/xsetwacom set 'Wacom Intuos S 2 Pad pad' Button 1 'key -'
/usr/bin/xsetwacom set 'Wacom Intuos S 2 Pad pad' Button 3 'key +'
/usr/bin/xsetwacom set 'Wacom Intuos S 2 Pad pad' Button 8 'key +Ctrl z -Ctrl'
/usr/bin/xsetwacom set 'Wacom Intuos S 2 Pad pad' Button 9 'key +Ctrl +Shift z -Ctrl -Shift'

如果我手动运行这个脚本,它可以正常工作。

我的目标是在插入pad时自动运行这个脚本。我尝试了以下udev规则:

/etc/udev/rules.d/10-wacom_intuos_s_2_pad.rules

代码语言:javascript
运行
复制
ACTION=="add", SUBSYSTEMS=="usb", ATTRS{idVendor}=="056a", ATTRS{idProduct}=="033b", RUN+="/usr/local/bin/wacom_intuos_s_2_pad_button_mapping.sh"

However,如果我插入键盘,脚本就不会映射按钮。

我正在运行Arch (5.5.10-arch1-1)

代码语言:javascript
运行
复制
$ lsusb
...
Bus 004 Device 015: ID 056a:033b Wacom Co., Ltd CTL-490 [Intuos Draw (S)]
...
代码语言:javascript
运行
复制
$ udevadm info -a -n hidraw0
...
  looking at parent device '/devices/pci0000:00/0000:00:10.0/usb4/4-2':
    KERNELS=="4-2"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{authorized}=="1"
    ATTRS{bcdDevice}=="0100"
    ATTRS{bmAttributes}=="80"
    ATTRS{bMaxPower}=="498mA"
    ATTRS{manufacturer}=="Wacom Co.,Ltd."
    ATTRS{quirks}=="0x0"
    ATTRS{maxchild}=="0"
    ATTRS{bNumInterfaces}==" 3"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{devpath}=="2"
    ATTRS{ltm_capable}=="no"
    ATTRS{busnum}=="4"
    ATTRS{devnum}=="15"
    ATTRS{tx_lanes}=="1"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{speed}=="12"
    ATTRS{version}==" 2.00"
    ATTRS{product}=="Intuos PS"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{idVendor}=="056a"
    ATTRS{configuration}==""
    ATTRS{devspec}=="(null)"
    ATTRS{urbnum}=="174"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{removable}=="unknown"
    ATTRS{rx_lanes}=="1"
    ATTRS{idProduct}=="033b"
...
代码语言:javascript
运行
复制
$ udevadm test --action="add" /devices/pci0000:00/0000:00:10.0/usb4/4-2
This program is for debugging only, it does not run any program
specified by a RUN key. It may show incorrect results, because
some values may be different, or not available at a simulation run.

Load module index
Parsed configuration file /usr/lib/systemd/network/99-default.link
Created link configuration context.
Reading rules file: /usr/lib/udev/rules.d/10-dm.rules
Reading rules file: /etc/udev/rules.d/10-wacom_intuos_s_2_pad.rules
...
Reading rules file: /usr/lib/udev/rules.d/65-libwacom.rules
...
Reading rules file: /usr/lib/udev/rules.d/wacom.rules
Invalid inotify descriptor.
DEVPATH=/devices/pci0000:00/0000:00:10.0/usb4/4-2
DEVNAME=/dev/bus/usb/004/015
DEVTYPE=usb_device
DRIVER=usb
PRODUCT=56a/33b/100
TYPE=0/0/0
BUSNUM=004
DEVNUM=015
MAJOR=189
MINOR=398
ACTION=add
SUBSYSTEM=usb
ID_VENDOR=Wacom_Co._Ltd.
ID_VENDOR_ENC=Wacom\x20Co.\x2cLtd.
ID_VENDOR_ID=056a
ID_MODEL=Intuos_PS
ID_MODEL_ENC=Intuos\x20PS
ID_MODEL_ID=033b
ID_REVISION=0100
ID_SERIAL=Wacom_Co._Ltd._Intuos_PS
ID_BUS=usb
ID_USB_INTERFACES=:030000:030102:
ID_VENDOR_FROM_DATABASE=Wacom Co., Ltd
ID_MODEL_FROM_DATABASE=CTL-490 [Intuos Draw (S)]
ID_PATH=pci-0000:00:10.0-usb-0:2
ID_PATH_TAG=pci-0000_00_10_0-usb-0_2
USEC_INITIALIZED=4102997566
run: '/usr/local/bin/wacom_intuos_s_2_pad_button_mapping.sh'
Unload module index
Unloaded link configuration context.
代码语言:javascript
运行
复制
$ journalctl -xe
Mar 22 17:38:55 scriptim systemd-udevd[5927]: 1-1: Process '/usr/local/bin/wacom_intuos_s_2_pad_button_mapping.sh' failed with exit code 255.
EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2020-03-27 23:36:52

从本质上说,这是一个竞赛条件和从udev规则运行时与从熟悉的图形终端运行时xsetwacom行为的差异的组合,原因是环境变量的差异。

问题1:环境变量.

首先解决第二个问题:这类似于从cron作业运行时,shell脚本的行为有所不同.的情况。

要将您的环境与udev环境进行比较,请运行任一 envprintenv

代码语言:javascript
运行
复制
printenv > my-env.txt

从图形终端,然后添加以下udev脚本:

代码语言:javascript
运行
复制
/usr/bin/printenv > /tmp/udev-env.txt

然后,您可以比较my-env.txtudev-env.txt

要推断xsetwacom使用的环境变量,安装ltrace运行这样的命令

代码语言:javascript
运行
复制
ltrace -f -e getenv -o my-ltrace-01.log xsetwacom set 'Wacom Intuos S 2 Pad pad' Button 1 'key -'

由于我没有Wacom设备,所以无法运行完整的命令。

代码语言:javascript
运行
复制
$ xsetwacom set 'Wacom Intuos S 2 Pad pad' Button 1 'key -'
Cannot find device 'Wacom Intuos S 2 Pad pad'.

但是,根据xsetwacom退出前的距离,我可以看出它使用了DISPLAYXAUTHORITY

代码语言:javascript
运行
复制
15447 libX11.so.6->getenv("DISPLAY")             = ":0"
15447 libxcb.so.1->getenv("DISPLAY")             = ":0"
15447 libxcb.so.1->getenv("DISPLAY")             = ":0"
15447 libXau.so.6->getenv("XAUTHORITY")          = "/home/nathaniel/.Xauthority"
15447 libX11.so.6->getenv("XLIBBUFFERSIZE")      = nil
15447 libX11.so.6->getenv("XLIB_SKIP_ARGB_VISUALS") = nil
15447 libX11.so.6->getenv("XKB_DEBUG")           = nil
15447 libX11.so.6->getenv("_XKB_OPTIONS_ENABLE") = nil
15447 libX11.so.6->getenv("XKB_DISABLE")         = nil
15447 +++ exited (status 0) +++

您可以通过打印这些值来找到它们。

代码语言:javascript
运行
复制
$ printf 'DISPLAY=%q\n' "$DISPLAY"
DISPLAY=:0
$ printf 'XAUTHORITY=%q\n' "$XAUTHORITY"
XAUTHORITY=/home/nathaniel/.Xauthority

然后在脚本的顶部定义它们。

代码语言:javascript
运行
复制
#!/bin/bash

# Just an example, yours will be different.
export DISPLAY=:0
export XAUTHORITY=/home/nathaniel/.Xauthority
sleep 1
# The rest of the script.

由于其他原因,该脚本仍可能无法工作,但消除环境变量的差异似乎已经足够其他人使用。相关问题中的另一个用户能够让它以这种方式在Ubuntu18.04上工作:

您需要向脚本中添加两个变量导出,一个用于DISPLAYXAUTHORITY。它们用于标识和访问正确的X会话。您可以通过以常规用户身份登录时运行env来获得适当的值。

问题2:种族条件.

现在,对于争用条件:xsetwacom命令依赖于X服务器识别硬件,所以在准备好之前运行它将导致它失败。sleep 1在一段时间内显然是足够的,但现在已经不再足够了。(有时人们使用sleep 2sleep 3sleep 4,但没有具体的原因。一般说来,sleep 1甚至是必要的,这让我感到困扰。)

当您插入设备时:

  1. Linux检测设备并根据udev规则创建设备条目。
  2. X服务器检测设备。

您不能在第2阶段之前运行xsetwacom。您的脚本正在失败,因为您在第1阶段运行它,而此时X还不知道设备。

- 吉尔斯,所以-别再作恶了https://unix.stackexchange.com/a/65792/30049

这一切都很好,但是当人们尝试这个的时候,它就不再起作用了:

我对你的详细答案投了反对票,但我不确定这是否正确,原因如下:我试着用几秒钟的时间使用sleep。当插入时,平板电脑工作不到一秒钟,所以当命令被执行时,设备已经被X检测和使用了。但还是不起作用?

- 评论雷德德罗

因为我没有你的硬件或操作系统,我不能复制你的问题。但是,下面是我从其他线程中收集到的信息:sleep延迟本身是不够的。有些人有解决办法,例如:

也许我看到的最彻底的解决方案是在链式螺纹中使用systemd服务文件:

最后,我不得不使用由udev规则触发的systemd服务启动脚本:$ cat /etc/udev/rues.d/99-wacom.ules SUBSYSTEM=="usb“、ENV{ID_VENDOR_ID}=="056a”、ENV{ID_MODEL_ID}=="0302“、TAG+=" systemd”TAG+="systemd"使其他systemd服务(系统或用户)能够依赖该设备(注册为设备单元,请参见man systemd.device)。

- 斯普卢佛https://unix.stackexchange.com/a/290940/30049

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/574258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档