17

Я пытаюсь настроить скрипт для запуска при каждом подключении USB-устройства. Я создал файл /etc/udev/rules.d/90-local.rules и добавил следующее правило:

ACTION=="add", SUBSYSTEM=="usb", KERNEL=="sd*", SYSFS{model}=="Cruzer*", RUN+="sh /home/jesse/Documents/Scripts/cruzer.sh"

Проблема в том, что когда диск подключен, ничего не происходит. Сценарий, для целей отладки, настроен на отправку уведомления с уведомлением-отправкой, которое установлено и отлично работает с терминала.

Путь к сценарию правильный, так как я без проблем выполнил эту команду в терминале.

6 ответов6

6

У меня такая же проблема. Это сработало для меня:

Попробуйте скопировать ваш скрипт в /usr/local/bin и измените каталог в вашем файле .rules .

Кроме того, я не знаю, что такое SYSFS, но я бы предпочел использовать свойства ATTR.

Следующая строка содержит содержимое моего файла .rules :

ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[a-z]1", ATTRS{vendor}=="SanDisk ", RUN+="/usr/local/bin/backup.sh"
6

notify notify-send требует доступа к вашей сеансовой шине DBus, которая не может быть по двум причинам:

  • Нет информации о сеансе. Когда ваш скрипт запускается udev, он ничего не знает о том, где вы вошли или вообще вошли в систему. Многопользовательское с X11 все еще сложно, но переключение пользователей работает как для X11, так и для консольных сессий. Многие люди также используют SSH, VNC и NX по сети.

    (DISPLAY=:0 будет работать в половине случаев, но в лучшем случае это все еще догадка .)

  • Запрещено политикой DBus. Даже если ваш скрипт каким-то образом найдет ваш сеанс X11, он не сможет отправлять уведомления из-за того, что скрипт запускается от имени пользователя root вместо вашей учетной записи пользователя.

1

Вместо этого вы можете попытаться сопоставить устройство по идентификатору производителя и продукта. Следующее пользовательское правило работает для меня:

ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="0763", ATTR{idProduct}=="019b", RUN+="/usr/bin/aconnect 20 128"

Вы можете увидеть idVendor и idProduct в выводе lsusb или dmesg после подключения устройства.

1

В продолжение ответа Алеха : Если вы также хотите отслеживать события remove , вам нужно найти переменную среды с именем ID_SERIAL . Он содержит идентификатор поставщика и продукта, разделенные подчеркиванием:

ACTION=="add|remove", SUBSYSTEM=="usb", ENV{ID_SERIAL}=="0763_019b" RUN+="/usr/bin/aconnect 20 128"

Правило теперь тоже короче.

0

Попробуйте заменить SUBSYSTEM = "usb" на SUBSYSTEMS = "usb"

0

Возможно, вам может понадобиться добавить sleep в сценарий, чтобы дать USB-устройству возможность "успокоиться"? Например, модемы usb 3g, переключение режимов для получения /dev /ttyUSB для запуска и запуска ядром.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .