Попытка запустить скрипт, когда мой телефон подключен через USB. Я создал правило udev в /etc/udev/rules.d/85-lazydroid.rule, которое выглядит следующим образом:
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
Есть идеи?
[EDIT] Хорошо, теперь я знаю, что правило udev работает, так как оно создает символическую ссылку. Я внес некоторые изменения в правило, см. Ниже:
SUBSYSTEM=="usb", ATTRS{idVendor}=="22b8", ATTRS{idProduct}=="428c", SYMLINK+="phone", RUN+="/bin/sh /home/joel/.lazydroid.sh"
Но скрипт все равно не запустится. И если я запускаю его отдельно, он все равно работает отлично.
Вы можете проверить, будет ли выполнено ваше правило, запустив
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
)
Также второй exec
в вашем bash-скрипте не будет выполняться так, как вы ожидаете, так как среда не определяет оконная система для запуска Chromium. Мне кажется, я понимаю, что вы пытались сделать здесь, но udev разработан так, чтобы быть неинтерактивным.
В ответ на ваш комментарий. В каждой системе Unix есть несколько абстрактных экранов, называемых дисплеями. X11, который является оконным менеджером (например, explorer.exe, для Ubuntu), занимает одну из них (я думаю, я работаю через ssh в основном 7 или 8). Когда вы запускаете графическую программу из командной строки (скажем, 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
source1 (udev)
source2 (man udevadm)
source3 (EXEC)
source4 (DISPLAY)
Я думаю, что вы на правильном пути.
Возможно, вы захотите разделить это на два скрипта -
Использовать базовый скрипт в 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
Я думаю, что проблема в том, как вы указали RUN. Вы должны написать RUN+="/bin/bash /home/joel/.lazydroid.sh"
Также сначала попробуйте запустить простой скрипт, такой как скопировать существующий файл в другое место.
Надеюсь, это поможет;)