
Я использую 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
не существует. Я так запутался. Очевидно, что это правило сопоставляется и правила применяются. Так почему же команда, указанная в RUN
execute, не выполняется?
решение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'