尝试在手机通过 USB 插入时运行脚本。我在 /etc/udev/rules.d/85-lazydroid.rule 中制定了一条如下所示的 udev 规则:
ATTRS{idVendor}=="22b8", ATTRS{idProduct}=="428c", RUN+="/home/joel/.lazydroid"
脚本.lazydroid
如下:
#!/bin/bash
exec adb forward tcp:8080 tcp:8080 &
exec chromium-browser 127.0.0.1:8080 --new-window &
脚本本身运行良好,但问题是,我无法在插入手机时运行脚本。
根据lsusb | grep Motorola
Bus 002 Device 042: ID 22b8:428c Motorola PCS
有任何想法吗?
[编辑] 好的,现在我知道 udev 规则正在运行,因为它创建了符号链接。我对规则做了一些更改,如下所示:
SUBSYSTEM=="usb", ATTRS{idVendor}=="22b8", ATTRS{idProduct}=="428c", SYMLINK+="phone", RUN+="/bin/sh /home/joel/.lazydroid.sh"
但脚本仍然无法运行。如果我单独运行它,它仍然可以完美运行。
答案1
您可以通过运行来测试您的规则是否会被命中
udevadm test /path/to/sysfs/dev
您可以使用以下命令找到设备 sysfs 节点:
udevadm info -q path -n /dev/sda #To find sysfs node for first HDD
综上所述,它将是:
udevadm test $(udevadm info -q path -n /dev/sda) 2>&1 | more
如果需要,可以使用 grep 查找脚本的名称,或者逐行读取。如果脚本被调用但未执行,请记住,udev 脚本中没有典型环境,因此必须通过其完整路径调用所有程序,或者根据自己的喜好重新创建环境。尝试将adb
和替换chromium-browser
为其绝对路径(which adb
和which chromium-browser
)
而且,由于环境没有指定 Chromium 启动的窗口系统,因此 bash 脚本中的第二个脚本exec
将无法按预期执行。我想我明白您在这里尝试做什么,但是 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
答案2
我认为你走在正确的道路上。
你可能想把它分成两个脚本 -
使用 udev 中的一个基本脚本,该脚本运行另一个脚本并退出;退出很重要,因为否则 udev 规则将等待脚本一和脚本二完成后再挂载。
你.lazydroid
应该
#!bin/bash
/home/joel/auto_mount.sh & exit
赋予其执行权限:
chmod +x .lazydroid
然后应该是你的原始文件/home/joel/auto_mount.sh
的内容.lazydroid
添加sleep 5
等待 5 秒钟,然后再运行脚本的其余部分。
再次赋予其执行权限:
chmod +x auto_mount.sh
答案3
我认为问题在于您指定 RUN 的方式您应该写RUN+="/bin/bash /home/joel/.lazydroid.sh"
另外首先尝试运行一个简单的脚本比如将现有文件复制到另一个位置。
希望能帮助到你 ;)