通过usb连接手机时启动脚本

cho*_*oel 6 usb udev

当我的手机通过 USB 插入时尝试运行脚本。我在 /etc/udev/rules.d/85-lazydroid.rule 中制定了一个 udev 规则,如下所示:

ATTRS{idVendor}=="22b8", ATTRS{idProduct}=="428c", RUN+="/home/joel/.lazydroid"
Run Code Online (Sandbox Code Playgroud)

脚本.lazydroid如下所示:

#!/bin/bash
exec adb forward tcp:8080 tcp:8080 &
exec chromium-browser 127.0.0.1:8080 --new-window &
Run Code Online (Sandbox Code Playgroud)

脚本本身运行良好,但问题是,我无法在插入电话时运行脚本。

它具有正确的 ID,根据 lsusb | grep Motorola

Bus 002 Device 042: ID 22b8:428c Motorola PCS
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

[编辑] 好的,现在我知道 udev 规则正在运行,因为它创建了符号链接。我对规则做了一些更改,见下文:

SUBSYSTEM=="usb", ATTRS{idVendor}=="22b8", ATTRS{idProduct}=="428c", SYMLINK+="phone", RUN+="/bin/sh /home/joel/.lazydroid.sh"
Run Code Online (Sandbox Code Playgroud)

但是脚本仍然不会运行。如果我单独运行它,它仍然可以完美运行。

Huc*_*kle 4

您可以通过运行来测试您的规则是否会被命中

udevadm test /path/to/sysfs/dev
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令找到设备 sysfs 节点:

udevadm info -q path -n /dev/sda  #To find sysfs node for first HDD
Run Code Online (Sandbox Code Playgroud)

因此,将所有内容放在一起将是:

udevadm test $(udevadm info -q path -n /dev/sda) 2>&1 | more
Run Code Online (Sandbox Code Playgroud)

如果需要,可以用 Grep 查找脚本的名称,也可以逐行阅读。如果您的脚本被调用但未执行,请记住您在 udev 脚本中没有典型的环境,因此您必须通过完整路径调用所有程序,或者根据您的喜好重新创建环境。尝试将adband替换chromium-browser为它们的绝对路径 (which adbwhich chromium-browser)

另外,bash 脚本中的第二个脚本exec不会像您期望的那样执行,因为环境没有指定 Chromium 启动的窗口系统。我想我明白您在这里试图做什么,但 udev 被设计为非交互式的。

回应您的评论。每个 UNIX 系统上都有一些抽象屏幕,称为显示器。X11,即 Ubuntu 的窗口管理器(想想 explorer.exe,有​​点)占据了其中之一(我想是 7 或 8,我主要通过 ssh 工作)。当您从命令行(例如 gedit)运行图形程序时,它将检查DISPLAY环境变量以确定它将在哪个显示器上进行绘制。

还有更多的事情,我个人从来没有对那里发生的“其他事情”有一个深入的了解,但我会尝试从你的脚本中做一些诊断事情:

mkdir /tmp/udev-script
/usr/bin/printenv > /tmp/udev-script/environment.log
/bin/echo "My script was run!" > /tmp/udev-script/script.log
DISPLAY=:8      # or :7, play around with that
export DISPLAY  # Promote shell variable to environment variable
exec /path/to/chromium 2> /tmp/udev-script/chromium.log 1>&2 &
exit            # This is important for udev, see sources
Run Code Online (Sandbox Code Playgroud)

源 1(udev)
源 2(man udevadm)
源 3(执行)
源 4(显示)