LINUX.ORG.RU

Правила udev - ЧЯДНТ?


0

1

Пытаюсь написать простенькое правило для udev, которое будет запускать скрипт, редактирующий .asoundrc при подключении моего внешнего ЦАП. На данный момент оно выглядит вот так:

#ACTION=="add", SUBSYSTEM=="sound", ATTRS{id}=="PCM2702", RUN+="sh /home/sergey/.scripts/asoundrcchanger.sh"
#ACTION=="remove", SUBSYSTEM=="sound", ATTRS{id}=="PCM2702", RUN+="sh /home/sergey/.scripts/asoundrcchanger.sh"
Если я убираю проверку атрибута (ATTRS{id}==«PCM2702») и проверяю, исполняется ли это правило:
udevadm test /class/sound/dsp
...то получаю в выхлопе следующее:
...
parse_file: reading '/etc/udev/rules.d/80-default-audio-device.rules' as rules file
...
udevadm_test: run: 'sh /home/sergey/.scripts/asoundrcchanger.sh'
...
То есть, правило исполняется и всё, по идее, должно быть нормально. Но при реальном подключении/отключении устройства ничего не происходит. Пробовал заменять в правиле выполнение скрипта на заглушку (echo 1 > /home/sergey/test), файл, так же, не создаётся.
Если выполнить
udevadm control log_priority=debug
, то в messages.log при подключении устройства появляется следующее:
Apr  9 18:23:08 myhost kernel: usb 2-2: new full speed USB device using uhci_hcd and address 10
Apr  9 18:23:09 myhost kernel: usbmixer: master volume quirk for PCM2702 chip
На всякий случай, выхлоп «udevadm info -a -p /sys/class/sound/card0/».

Я знаю, здесь есть люди, для которых проблема очевидна. Огромная просьба к ним - постучать мне по лбу и помочь советом. :-)

★★★★★

/bin/sh
/bin/echo
чтобы правило заработало
udevadm control --reload-rules

bass ★★★★★ ()
Ответ на: комментарий от bass

Facepalm.jpg. Я - сказочный долбоклюй...
Тем не менее, поправил, но не помогло.

Axon ★★★★★ ()

> ATTRS{id}==«PCM2702»

А между прочим, по ссылке http://pastebin.com/WAWjnXtr

ATTR{id}==«PCM2702»

Мне впрочем кажется, что лучше использовать:

ATTRS{product}==«Burr-Brown Japan PCM2702»

Про пути к sh и echo уже сказали.

Alan_Steel ★★ ()
Ответ на: комментарий от Alan_Steel

ATTRS я уже и сам поправил, но, как я и говорил, даже вообще без этого условия, всё равно не работает. И /bin/sh, как и /bin/echo, так же были, явно, не единственной проблемой.

Axon ★★★★★ ()
Ответ на: комментарий от Alan_Steel

ls -la /home/sergey/.scripts/asoundrcchanger.sh

-rwxr-xr-x 1 sergey users 348 Апр  9 15:48 /home/sergey/.scripts/asoundrcchanger.sh

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

ls -la /home/sergey/test

Зачем? O_o У меня его нет сейчас вообще. Это просто «флажок», сигнализирующий о том, что событие обработано и проавило исполнено.

Axon ★★★★★ ()

Может надо воткнуть их пораньше, например «10-...rules»?

mky ★★★★★ ()

#ACTION==«add как бы # <- комментарий

anonymous2 ★★★★ ()
Ответ на: комментарий от anonymous2

как бы # <- комментарий

Я, конечно, олень, но не такой же! Эти строки копипастились во время экспериментов с заглушкой вместо выполнения скрипта. Сейчас они раскомментированы, естественно.

Axon ★★★★★ ()
Ответ на: комментарий от Axon

экстрасенсов здесь нет, и оленей сечас вы пытаетесь из нас всех сделать.
что у вас там сейчас скопировано и изменено, ни кто не знает, и по факту! на тот вариант который вы представили вам ответы были даны.
я за бан!

anonymous2 ★★★★ ()
Ответ на: комментарий от anonymous2

оленей сечас вы пытаетесь из нас всех сделать.

А теперь внимательно перечитайте топик и если из него не ясно, что указанные мной в правиле действия в тестовых условиях выполняются, то оленя делать мне не нужно. Нет желания помогать - просьба не хамить, хотя бы.

Axon ★★★★★ ()
Ответ на: комментарий от mky

Может надо воткнуть их пораньше, например «10-...rules»?

Проверил - никакой разницы. Логично, в общем-то...

Axon ★★★★★ ()
Ответ на: комментарий от Axon

Ладно, давай сначала разберёмся, срабатывает правило или нет. Поставь на заглушку вот эту команду:

RUN+="/usr/bin/touch /tmp/sound_test_ok"
втыкай устройство и давай
ls -la /tmp/sound_test_ok

Подозреваю, что у тебя скрипт выполняется от какого-нибудь юзера (например udev), у которого нет права на запись в твой каталог.

Alan_Steel ★★ ()

Блин, мистика какая-то. Сейчас решил снова покурить логи. Переключил режим логирования udev в debug и понял, что такое debug и что раньше он не включался! Вот лог udev, созданный после отключения-подключения моего устройства. В этот момент правило выглядело вот так:

ACTION=="add", SUBSYSTEMS=="sound", RUN="/bin/echo 1 > /home/sergey/test"
ACTION=="remove", SUBSYSTEMS=="sound", RUN="/bin/echo 0 > /home/sergey/test"
И теперь я окончательно перестал что-либо понимать!!! Вот он, пропущенный через «grep echo»:
Apr 10 08:43:30 myhost udevd-work[9096]: RUN '/bin/echo 0 > /home/sergey/test' /etc/udev/rules.d/10-default-audio-device.rules:10
Apr 10 08:43:30 myhost udevd-work[9096]: '/bin/echo 0 > /home/sergey/test' started
Apr 10 08:43:30 myhost udevd-work[9097]: RUN '/bin/echo 0 > /home/sergey/test' /etc/udev/rules.d/10-default-audio-device.rules:10
Apr 10 08:43:30 myhost udevd-work[9097]: '/bin/echo 0 > /home/sergey/test' started
Apr 10 08:43:30 myhost udevd-work[9096]: '/bin/echo' (stdout) '0 > /home/sergey/test'
Apr 10 08:43:30 myhost udevd-work[9097]: '/bin/echo' (stdout) '0 > /home/sergey/test'
Apr 10 08:43:30 myhost udevd-work[9174]: RUN '/bin/echo 0 > /home/sergey/test' /etc/udev/rules.d/10-default-audio-device.rules:10
Apr 10 08:43:30 myhost udevd-work[9172]: RUN '/bin/echo 0 > /home/sergey/test' /etc/udev/rules.d/10-default-audio-device.rules:10
Apr 10 08:43:30 myhost udevd-work[9172]: '/bin/echo 0 > /home/sergey/test' started
Apr 10 08:43:30 myhost udevd-work[9173]: RUN '/bin/echo 0 > /home/sergey/test' /etc/udev/rules.d/10-default-audio-device.rules:10
Apr 10 08:43:30 myhost udevd-work[9173]: '/bin/echo 0 > /home/sergey/test' started
Apr 10 08:43:30 myhost udevd-work[9174]: '/bin/echo 0 > /home/sergey/test' started
Apr 10 08:43:30 myhost udevd-work[9097]: '/bin/echo 0 > /home/sergey/test' returned with exitcode 0
Apr 10 08:43:30 myhost udevd-work[9096]: '/bin/echo 0 > /home/sergey/test' returned with exitcode 0
Apr 10 08:43:30 myhost udevd-work[9172]: '/bin/echo' (stdout) '0 > /home/sergey/test'
Apr 10 08:43:30 myhost udevd-work[9173]: '/bin/echo' (stdout) '0 > /home/sergey/test'
Apr 10 08:43:30 myhost udevd-work[9174]: '/bin/echo' (stdout) '0 > /home/sergey/test'
Apr 10 08:43:30 myhost udevd-work[9173]: '/bin/echo 0 > /home/sergey/test' returned with exitcode 0
Apr 10 08:43:30 myhost udevd-work[9172]: '/bin/echo 0 > /home/sergey/test' returned with exitcode 0
Apr 10 08:43:30 myhost udevd-work[9174]: '/bin/echo 0 > /home/sergey/test' returned with exitcode 0
Apr 10 08:43:30 myhost udevd-work[9096]: RUN '/bin/echo 0 > /home/sergey/test' /etc/udev/rules.d/10-default-audio-device.rules:10
Apr 10 08:43:30 myhost udevd-work[9096]: '/bin/echo 0 > /home/sergey/test' started
Apr 10 08:43:30 myhost udevd-work[9096]: '/bin/echo' (stdout) '0 > /home/sergey/test'
Apr 10 08:43:30 myhost udevd-work[9096]: '/bin/echo 0 > /home/sergey/test' returned with exitcode 0
Apr 10 08:43:33 myhost udevd-work[9174]: RUN '/bin/echo 1 > /home/sergey/test' /etc/udev/rules.d/10-default-audio-device.rules:9
Apr 10 08:43:33 myhost udevd-work[9174]: '/bin/echo 1 > /home/sergey/test' started
Apr 10 08:43:33 myhost udevd-work[9174]: '/bin/echo' (stdout) '1 > /home/sergey/test'
Apr 10 08:43:33 myhost udevd-work[9174]: '/bin/echo 1 > /home/sergey/test' returned with exitcode 0
Apr 10 08:43:33 myhost udevd-work[9177]: RUN '/bin/echo 1 > /home/sergey/test' /etc/udev/rules.d/10-default-audio-device.rules:9
Apr 10 08:43:33 myhost udevd-work[9174]: RUN '/bin/echo 1 > /home/sergey/test' /etc/udev/rules.d/10-default-audio-device.rules:9
Apr 10 08:43:33 myhost udevd-work[9177]: '/bin/echo 1 > /home/sergey/test' started
Apr 10 08:43:33 myhost udevd-work[9174]: '/bin/echo 1 > /home/sergey/test' started
Apr 10 08:43:33 myhost udevd-work[9174]: '/bin/echo' (stdout) '1 > /home/sergey/test'
Apr 10 08:43:33 myhost udevd-work[9177]: '/bin/echo' (stdout) '1 > /home/sergey/test'
Apr 10 08:43:33 myhost udevd-work[9197]: RUN '/bin/echo 1 > /home/sergey/test' /etc/udev/rules.d/10-default-audio-device.rules:9
Apr 10 08:43:33 myhost udevd-work[9196]: RUN '/bin/echo 1 > /home/sergey/test' /etc/udev/rules.d/10-default-audio-device.rules:9
Apr 10 08:43:33 myhost udevd-work[9197]: '/bin/echo 1 > /home/sergey/test' started
Apr 10 08:43:33 myhost udevd-work[9195]: RUN '/bin/echo 1 > /home/sergey/test' /etc/udev/rules.d/10-default-audio-device.rules:9
Apr 10 08:43:33 myhost udevd-work[9177]: '/bin/echo 1 > /home/sergey/test' returned with exitcode 0
Apr 10 08:43:33 myhost udevd-work[9195]: '/bin/echo 1 > /home/sergey/test' started
Apr 10 08:43:33 myhost udevd-work[9174]: '/bin/echo 1 > /home/sergey/test' returned with exitcode 0
Apr 10 08:43:33 myhost udevd-work[9197]: '/bin/echo' (stdout) '1 > /home/sergey/test'
Apr 10 08:43:33 myhost udevd-work[9195]: '/bin/echo' (stdout) '1 > /home/sergey/test'
Apr 10 08:43:33 myhost udevd-work[9197]: '/bin/echo 1 > /home/sergey/test' returned with exitcode 0
Apr 10 08:43:33 myhost udevd-work[9195]: '/bin/echo 1 > /home/sergey/test' returned with exitcode 0
Apr 10 08:43:33 myhost udevd-work[9196]: '/bin/echo 1 > /home/sergey/test' started
Apr 10 08:43:33 myhost udevd-work[9196]: '/bin/echo' (stdout) '1 > /home/sergey/test'
Apr 10 08:43:33 myhost udevd-work[9196]: '/bin/echo 1 > /home/sergey/test' returned with exitcode 0

Axon ★★★★★ ()
Ответ на: комментарий от Alan_Steel

RUN+=«/usr/bin/touch /tmp/sound_test_ok»
втыкай устройство и давай
ls -la /tmp/sound_test_ok

YEEEEEHHAAAAAH!!!!
Файл создаётся!!!

Axon ★★★★★ ()
Ответ на: комментарий от Alan_Steel

И как заставить это дело выполняться от нужного пользователя?

Axon ★★★★★ ()
Ответ на: комментарий от Alan_Steel
ls -la /tmp/sound_test_ok 
-rw-r--r-- 1 root root 0 Апр 10 09:00 /tmp/sound_test_ok
Axon ★★★★★ ()
Ответ на: комментарий от Axon

Примерно так: «/bin/su sergey -c 'command'»

Ок, с правилом разобрались. Теперь нужно понять, почему твой скрипт не работает. Скрипт в студию.

Alan_Steel ★★ ()
Ответ на: комментарий от Alan_Steel

Скрипт работает, я им уже несколько месяцев пользуюсь. Я его просто раньше вручную запускал, так как правило написать не осилил. :-)

Axon ★★★★★ ()
Ответ на: комментарий от Axon

> То есть, правило исполняется и всё, по идее, должно быть нормально. Но при реальном подключении/отключении устройства ничего не происходит.

Раз ты запускал его вручную и всё было ок, то проблема где-то в районе $PATH.

Alan_Steel ★★ ()
Ответ на: комментарий от Alan_Steel

Примерно так: «/bin/su sergey -c 'command'»

Работает!!! Огромное человеческое спасибо!

Axon ★★★★★ ()
Ответ на: комментарий от Axon

Дак он на 10- или на 80- работает? И какой у вас дистрибутив и почему не работало на 80-, какое правило срабатывало раньше?

mky ★★★★★ ()
Ответ на: комментарий от mky

Он и на 10 и на 80 работает. Цифра сама по себе ничего не значит, а просто определяет, в каком порядке правила будут исполняться. А не работал он из-за того, что выполнялся от непойми какого пользователя, не имеющего прав на запись в мою хомку. Как выше было указано, если в правиле прописать выполнение от конкретного пользователя (/bin/su sergey -c 'command), то всё отлично.

Axon ★★★★★ ()
Ответ на: комментарий от Axon

>Цифра сама по себе ничего не значит, а просто определяет, в каком порядке правила будут исполняться.

В общем случае порядок выполнение правил имеет значение: http://www.linux.org.ru/forum/admin/3715193 . Вы не указали дистрибутив, поэтому не понятно, может у вас там где то раньше было общее правило для всего «SUBSYSTEM==„sound“».

mky ★★★★★ ()
Ответ на: комментарий от mky

Понял, в чём разница, но работает у меня и так и так. Хотя в одном случае правило исполняется самым первым, а во втором - самым последним. Видимо, у меня нет других правил с такими условиями. Дистрибутив Arch Linux.
Я так понял, кстати, что одним условиям может удовлетворять только одно правило, и остальные будут игнорироваться? В таком случае, спасибо за информацию, возможно, вы спасли меня от граблей в будущем. :-)

Axon ★★★★★ ()
Ответ на: комментарий от Axon

>одним условиям может удовлетворять только одно правило

Нет, несколько правил могут удовлетворять одному условию, и они будут выполнены по очереди, а вот результат (значения ключей на выходе) зависит от их содержимого ( «=» задать значение, «+=» добавить значение, ":=" задать и запретить дальнейшее переопределение). А с учётом наличия goto можно такого наворотить :)

mky ★★★★★ ()
Ответ на: комментарий от mky

Спасибо за справку. А то я прочитал вот это руководство, но оно какое-то поверхностное.

Axon ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.