【问题标题】:Run script after all udev rules are through and device is completely initialized在所有 udev 规则通过并且设备完全初始化后运行脚本
【发布时间】:2021-01-14 12:27:37
【问题描述】:

我正在尝试从连接 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规则都通过并且设备完全初始化之后,有什么方法可以运行脚本?

【问题讨论】:

标签: linux scripting usb libusb udev


【解决方案1】:

要走的路似乎是 systemd。

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 单元一直等到创建符号链接并在此之后执行脚本。

【讨论】:

    猜你喜欢
    • 2011-01-04
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多