Как проверить, сработало ли правило udev?


15

Я пытаюсь познакомиться с Udev под Ubuntu 13.10.

Вот мое первое простое правило 95.usbbackup.rules:

ACTION=="add", SUBSYSTEMS="usb", RUN+="/usr/local/bin/my_backup.sh"

и вот скрипт (который был chmodded + x) my_backup.sh:

#!/bin/bash
touch /tmp/test

Ничего не происходит, когда я подключаю внешние диски. Как я могу проверить (журнал, команда, что угодно), сработало ли правило?

большое спасибо


2
Я думаю, что вы имеете в виду SUBSYSTEMS=="usb". Т.е. double, ==который проверяет равенство, а не single, =который присваивает значение ключу.
Lqueryvg

Ответы:


5

Я почти уверен, что это должно сработать. Перезагружали ли вы свои правила udev после редактирования своих правил?

udevadm control --reload-rules && udevadm trigger как корень.


Я сделал более узкое правило: KERNEL == "sdb", который работает. Обрабатывает ли udev только правила, которые однозначно идентифицируют некоторые аппаратные средства?
pouzzler

Нет, попробуйте KERNEL!="sdz*"и вы должны получить все (кроме SDZ [1-9])
Redsandro

5
Это на самом деле не отвечает на вопрос. Как узнать, сработали ли правила?
DanielSank

1
Вы знаете, потому что скрипт запущен. Вы можете сделать это написать в лог-файл. Такжеudevadm monitor
Redsandro

2

Вы можете дать команду от имени root следующим образом:

Udevadm монитор

Это покажет, когда правило сработало.


11
udevadm monitorпросто показывает события udev, но не если соответствующее правило было запущено. Однако вы можете найти событие, которое должно вызвать правило, но тогда вы не знаете, работает ли ваше правило.
Ф.Рааб

2

Я использую ядро ​​3.0.35, но у меня работает следующее.

Чтобы получить путь для устройства, вы можете сделать что-то вроде этого:

udevadm info --name /dev/sda1 --query all

Вы получите больше информации, чем вам нужно, но вы заинтересованы в DEVPATH. Затем, чтобы увидеть, какие правила udev выполняются, вы запускаете это:

udevadm test DEVPATH

Я не думаю, что это на самом деле выполняет правила, документация говорит, что это «имитирует» события для данного устройства. Для получения дополнительной информации посетите эту справочную страницу: https://www.freedesktop.org/software/systemd/man/udevadm.html.


1

С версией udev / systemd 241 и аналогичной с правами root:

udevadm control --log-priority=debug
journalctl -f

Или сделать его постоянным, снова как root:

vi /etc/udev/udevd.conf
systemctl restart systemd-udevd
journalctl -f

PS: самый частый пока что ИМХО неправильный ответ выглядит так:

udevadm -d test / devices / где / is / my / device | & less

... но это имеет ряд проблем. Основные из них:

  • where/is/my/device? Утомительно, сложно и подвержено ошибкам.

  • Сравнение старых ответов с недавним выводом udev версии 241, udevadm testпохоже, показывает меньше информации, чем раньше.

  • udevadm -d test это всего лишь симуляция ! Каждый раз, когда он предупреждает:

    Эта программа предназначена только для отладки, она не запускает никаких программ, указанных ключом RUN. Он может показывать неверные результаты, потому что некоторые значения могут отличаться или не быть доступными во время симуляции.

udevadm test предназначен для разработки нового правила, а не для устранения неполадок с нарушенными, отсутствующими или переопределенными правилами.


0

У меня была такая же проблема с Raspberry Pi 3 B +. Я пытался вызвать скрипт при вставке USB-накопителя. Правила не регистрируются в системном журнале, поэтому становится очень трудно понять, какое правило сработало или какое правило не удалось.

Итак, я сделал следующее:

  1. Я сделал свой файл правил в /etc/udev/rules.d/100-myrule.rules
  2. Затем я запустил команду sudo /etc/init.d/udev restart

и когда я проверил, это сработало.

Часть информации, которая может или не может быть полезной, состоит в том, что файловые системы доступны только для udev, пока не будет выполнена команда на шаге 2.


0

udevadm test $(udevadm info --query=path --name=device_name)должен сказать вам, какие команды будут выполняться на подключаемом устройстве, ссылаясь на соответствующие udevправила. Например:

# udevadm test /block/sdd
...
udev_rules_apply_to_event: PROGRAM '/sbin/multipath -c /dev/sdd' /lib/udev/rules.d/40-multipath.rules:11
...
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.