How do I make udev rules work?
I would like to learn udev rules. Here is what I do:
victor@X301A1:~$ ls /etc/udev/rules.d/
70-persistent-cd.rules 70-persistent-net.rules README
Then:
victor@X301A1:~$ sudo gedit /etc/udev/rules.d/01-my-first-udev.rules
My rule:
ACTION=="add", RUN+="echo HELLO ! > /home/victor/udev_test_log.txt"
After saving the file:
sudo udevadm control --reload-rules
I expected that connecting an USB device would write in the file but nothing happens. Where am I wrong?
In RUN you must to put a path to a script. See man udev
:
Add a program to the list of programs to be executed for a specific device. This can only be used for very short running tasks. Running an event process for a long period of time may block all further events for this or a dependent device. Long running tasks need to be immediately detached from the event process itself.
For examle, create a new script, let say hello.sh
in /lib/udev
with sudo -H gedit /lib/udev/hello.sh
and put next lines inside:
#!/bin/bash
echo HELLO ! > /home/<username>/udev_test_log.txt
Change <username>
with your user name. Save the file, close it and make it executable with:
chmod +x /lib/udev/hello.sh
Add a new rule in your /etc/udev/rules.d/01-my-first-udev.rules
file like this:
ACTION=="add", RUN+="/lib/udev/hello.sh"
Actually, I couldn't get a reference for this; But It's something got by Try & Error.
udev
requires the full path of script/program/file used either inPROGRAM
,TEST
,RUN
orIMPORT
.udev
doesn't support redirection operations.udev
can handle command with arguments.udev
has variable substitution.
So you can write multifunction script (not just blind/single task script :) ), Example that sure it works for me:
KERNEL=="2-1.2:1.[0-9]*", DRIVER!="usb-storage", RUN+="/bin/sh -c 'echo -n %k,%p > /home/sneetsher/Desktop/%n.txt'"
-
/bin/sh
absolute path -
>
redirection is handled inside shell -
-c '...'
2 command arguments -
%k
,%p
,%n
udev variables (device kernel name, device path, device number)
So for your case:
ACTION=="add", RUN+="/bin/sh -c 'echo HELLO ! > /home/victor/udev_test_log.txt'"