правило udev для подключения/отключения usb не срабатывает

правило udev для подключения/отключения usb не срабатывает

Я использую RHEL6 и пытаюсь написать правило udev, которое срабатывает при подключении и отключении usb-устройств. Я создал файл с именем 80-usb.rulesи /etc/udev/rules.d/дал ему следующее содержимое (пока ничего особенного, просто хочу протестировать):

ACTION=="add", SUBSYSTEMS=="usb", RUN+="touch /tmp/test"

Я сохранил файл и подключил USB-накопитель для проверки. Однако файл /tmp/testне был создан.

Я полагаю, что мое правило udev должно соответствовать моему USB-накопителю, поскольку я могу запустить его udevadm infoна USB-накопителе, и по крайней мере одно из родительских устройств имеет атрибут SUBSYSTEMS=="usb".

Почему правило udev может не сработать?

Я попробовал запустить udevadm test --action=add /path/to/deviceи стало ясно, что .rulesфайл, который я написал, обрабатывается и мои правила сопоставляются. Вот несколько соответствующих строк из вывода:

parse_file: reading '/etc/udev/rules.d/80-usb.rules' as rules file
udev_rules_apply_to_event: RUN '/bin/touch /tmp/test' /etc/udev/rules.d/80-usb.rules:1
udevadm_test: run: '/bin/touch /tmp/test'

Но все равно /tmp/testне существует. Я так запутался. Очевидно, что это правило сопоставляется и правила применяются. Так почему же команда, указанная в RUNexecute, не выполняется?

решение1

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

ACTION=="add", SUBSYSTEMS=="usb", RUN+="/usr/bin/touch /tmp/test"

Редактировать:

А если вы хотите выполнить скрипт, вы должны указать, какая оболочка его выполнит:

ACTION=="add", SUBSYSTEMS=="usb", RUN+="/bin/sh /path/to/your/script"

решение2

Вам необходимо обеспечить следующее:

  • Пути в RUNкоманде должны быть абсолютными.
  • Файл должен быть исполняемым.
  • Окружающая среда PATHограничена в пределах выполнения вашей команды

Сначала добавьте этот файл скрипта в/lib/udev/touch.sh

vim /lib/udev/touch.sh

в этом файле напишите:

#!/bin/bash
touch /tmp/test

сделать его исполняемым:

chmod +x /lib/udev/touch.sh

и измените файл правил на:

ACTION=="add", SUBSYSTEMS=="usb", RUN+="/lib/udev/touch.sh"

перезагрузите ваши правила udev

udevadm control --reload-rules

Это снова прочитает ваши правила /lib/udev/rules.d/*. Изменения не будут применяться до этого момента.

Обратите внимание, что udev выполняет ваш скрипт с сокращенной PATHсредой. Вам нужно убедиться, что любой двоичный файл, который не находится в настроенных путях, должен быть доступен с полным путем. Вы также можете расширить PATHсреду в своем скрипте.

Проверьте, какой путь определен, записав setвывод в файл журнала из вашего скрипта-обертки:

set >>/tmp/udev-env-test

Это может выглядеть так:

PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'

Связанный контент