Я хочу выполнить скрипт, когда я подключаю устройство к моей машине с Linux. Например, запустите xinput
мышь или резервную копию на определенном диске.
Я видел много статей по этому вопросу, в последнее время здесь и здесь . Но я просто не могу заставить его работать.
Вот несколько простых примеров, пытающихся получить хоть какой-то ответ.
/etc/udev/rules.d/test.rules
#KERNEL=="sd*", ATTRS{vendor}=="*", ATTRS{model}=="*", ATTRS{serial}=="*", RUN+="/usr/local/bin/test.sh"
#KERNEL=="sd*", ACTION=="add", "SUBSYSTEM=="usb", ATTRS{model}=="My Book 1140 ", ATTRS{serial}=="0841752394756103457194857249", RUN+="/usr/local/bin/test.sh"
#ACTION=="add", "SUBSYSTEM=="usb", RUN+="/usr/local/bin/test.sh"
#KERNEL=="sd*", ACTION=={add}, RUN+="/usr/local/bin/test.sh"
KERNEL=="sd*", RUN+="/usr/local/bin/test.sh"
KERNEL=="*", RUN+="/usr/local/bin/test.sh"
/usr/local/bin/test.sh
#!/usr/bin/env bash
echo touched >> /var/log/test.log
if [ "${ACTION}" = "add" ] && [ -f "${DEVICE}" ]
then
echo ${DEVICE} >> /var/log/test.log
fi
Папка правил отслеживается inotify
и должна быть активна немедленно. Я продолжаю подключать клавиатуру, мышь, планшет, карту памяти и USB-накопитель, но ничего. Файл журнала не тронут.
Теперь, какой самый простой способ хотя бы узнать, что что-то работает? Легче работать с чем-то, что работает, чем с чем-то, что нет.
udevadm trigger
или подключаете устройство, чтобы применить новое правило?3.5.0-23-generic
.Ответы:
Если вы хотите запустить скрипт на определенном устройстве, вы можете использовать идентификаторы поставщика и продукта
В
/etc/udev/rules.d/test.rules
:в
test.sh
:С помощью
env
вы можете увидеть, какая среда установлена из udev, а с помощьюfile
вы обнаружите тип файла.Конкретные атрибуты для вашего устройства могут быть обнаружены с
lsusb
дает
источник
ACTION=="add",
непосредственно в определение правила.Речь идет не о вашем вопросе, а о том, что вы делаете. Если вы запустите скрипт резервного копирования из udev, вы столкнетесь с двумя основными проблемами:
Мой совет заключается в том, чтобы создать в вашем домашнем компьютере скрипт, который будет прослушивать именованный канал и который будет запускаться асинхронно, например:
Примечание: я использую автоматическое монтирование с kde, поэтому проверяю, появляется ли папка. Вы можете передать параметр / dev / sd * в fifo из правила udev и самостоятельно смонтировать его в сценарии. Чтобы писать в fifo, не забывайте, что udev не является оболочкой и перенаправление не работает. Ваш RUN должен быть таким:
RUN + = "/ bin / sh -c '/ bin / echo connected >> / tmp / IomegaUsbPipe'"
источник
Я разместил решение на /ubuntu//a/516336, и я также копирую его здесь.
Я написал скрипт на Python, используя pyudev , и оставляю работать в фоновом режиме. Этот скрипт слушает события udev (таким образом, он очень эффективен) и выполняет любой код, который я хочу. В моем случае он запускает
xinput
команды для настройки моих устройств ( ссылка на самую последнюю версию ).Вот короткая версия того же скрипта:
источник
call()
. Таким образом, если необходимо предоставить аргументыfoobar.sh
скрипту, вы можете сделать это динамически.Чтобы запустить скрипт при загрузке USB-устройства, я использую решение ниже:
Отформатируйте pendrive или любое другое USB-хранилище и присвойте ему имя при этом. Затем в
/etc/rc.local
строке добавленияls -q /dev/disk/by-label > /home/pi/label.txt
он создаст текстовый файл с именем label.txt (может быть любым другим именем)
затем снова в /etc/rc.local добавьте еще 2 строки:
Теперь каждый раз, когда pendrive с именем USB_drive_name вставляется, он запускает скрипт.
С помощью нескольких небольших модификаций вышеуказанное решение можно использовать, когда система запущена и работает.
источник
udev
для других времен не «несколько маленьких модификаций») и Raspberry Pi. Это не нужноsudo
-rc.local
запускается с правами root, это проблема повышения привилегий - файл, который редактируется обычным пользователем, запускается с правами root.