连接usb设备后,我正在尝试从该设备读取信息。
我需要的信息是通过两个API访问的: v4l2和libusb。两者都通过脚本使用,该脚本在预期v4l2部件执行时被正确调用。
SUBSYSTEM=="usb", ATTRS{idVendor}=="199a", GROUP="video", MODE="0666", TAG+="uaccess", TAG+="udev-acl"
ACTION=="add", SUBSYSTEM=="video4linux", \
ATTRS{idVendor}=="199a" \
RUN+="/usr/bin/camera-infos-wrapper %s{serial}"
当我手动运行脚本时,所有步骤都正确执行。我在脚本周围有一个包装器来设置额外的环境变量。
#!/usr/bin/env bash
export DISPLAY=":0"
export XAUTHORITY=/home/user/.Xauthority
# sleep 3 <- does not work
# sleep 4 <- works
# ensure debug output is logged
exec 1> >(logger -s -t $(basename $0)) 2>&1
/usr/bin/tcam-index-camera $1
当我睡眠3秒时,libusb无法正确打开设备。睡眠4秒即可正确访问。由于这必须比在PC上运行更多,我更喜欢一个更强大的解决方案。
在所有udev规则都通过并且设备完全初始化之后,有没有办法运行脚本?
发布于 2021-02-16 09:06:26
要走的路似乎是系统的。
systemd单元camera-index@.service
[Unit]
Description=My service
After=dev-ident%i.device
Wants=dev-ident%i.device
[Service]
Type=forking
ExecStart=/usr/bin/script %i
注意文件名中的'@‘。它很重要,因为它是参数所必需的。
udev规则如下所示:
ACTION=="add", SUBSYSTEM=="video4linux", \
ATTRS{idVendor}=="<vendor id>", \
TAG+="systemd", \
SYMLINK+="ident%s{serial}", \
ENV{SYSTEMD_WANTS}="camera-index@%s{serial}.service"
systemd单元等待,直到创建了symlink,然后执行脚本。
https://stackoverflow.com/questions/65718937
复制