Я пытаюсь создать правила udev на Ubuntu 17.10. После нескольких часов тестирования я отчаянно закончил следующие правила в /etc/udev/rules.d/98-intelpwm.rules:
(он предназначен только для тестирования!)
ACTION=="add", RUN+="/home/user/intel_gpu/test.sh"
Сам скрипт:
$ ll /home/user/intel_gpu/test.sh
-rwxrwxrwx 1 user user 56 Oct 22 01:38 /home/user/intel_gpu/test.sh*
#!/bin/sh
/bin/echo 1 >> /home/user/intel_gpu/test.output
Когда я запускаю udevadm test /module/usb_storage, я вижу, что правило срабатывает, но test.output не создается (или если я создаю его вручную, он не обновляется). [ ! d4] calling: test
version 234
This program is for debugging only, it does not run any program
specified by a RUN key. It may show incorrect results, because
some values may be different, or not available at a simulation run.
=== trie on-disk ===
tool version: 234
file size: 9138024 bytes
header size 80 bytes
strings 1910832 bytes
nodes 7227112 bytes
Load module index
Failed to read $container of PID 1, ignoring: Permission denied
Found container virtualization none.
timestamp of '/etc/systemd/network' changed
timestamp of '/lib/systemd/network' changed
Parsed configuration file /lib/systemd/network/99-default.link
Created link configuration context.
timestamp of '/etc/udev/rules.d' changed
Reading rules file: /lib/udev/rules.d/39-usbmuxd.rules
Reading rules file: /lib/udev/rules.d/40-usb-media-players.rules
...
Reading rules file: /etc/udev/rules.d/98-intelpwm.rules
Reading rules file: /lib/udev/rules.d/99-systemd.rules
rules contain 393216 bytes tokens (32768 * 12 bytes), 35397 bytes strings
27571 strings (233697 bytes), 24356 de-duplicated (201516 bytes), 3216 trie nodes used
value '[dmi/id]sys_vendor' is 'ASUSTeK COMPUTER INC.'
value '[dmi/id]sys_vendor' is 'ASUSTeK COMPUTER INC.'
RUN '/home/user/intel_gpu/test.sh' /etc/udev/rules.d/98-intelpwm.rules:1
ACTION=add
DEVPATH=/module/usb_storage
SUBSYSTEM=module
USEC_INITIALIZED=4988363806
run: '/home/user/intel_gpu/test.sh'
Unload module index
Unloaded link configuration context.
Что мне не хватает?
Чтобы применить правило udev, вы должны использовать udevadm trigger. Кроме того, вы можете указать udevadm trigger, какое действие вызывать.
Если вы только запустили udevadm trigger, все устройства будут запущены, и будут выполняться некоторые add действия, которые вызовут ваш скрипт, потому что он действителен для всех устройств. Если вы хотите запустить правило udev для определенного уже имеющегося устройства, возможно, вам придется добавить параметр -c, --action=ACTION.
udevadm trigger --action=add /sys/<path-to-your-device>
Я настоятельно рекомендую ограничить совпадения ваше udev правило, потому что в данный момент оно соответствует любому устройству, и ваш скрипт будет выполняться несколько раз.
Чтобы применить правило udev, вы должны использовать udevadm trigger. Кроме того, вы можете указать udevadm trigger, какое действие вызывать.
Если вы только запустили udevadm trigger, все устройства будут запущены, и будут выполняться некоторые add действия, которые вызовут ваш скрипт, потому что он действителен для всех устройств. Если вы хотите запустить правило udev для определенного уже имеющегося устройства, возможно, вам придется добавить параметр -c, --action=ACTION.
udevadm trigger --action=add /sys/<path-to-your-device>
Я настоятельно рекомендую ограничить совпадения ваше udev правило, потому что в данный момент оно соответствует любому устройству, и ваш скрипт будет выполняться несколько раз.