6

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?

9

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"
  • I tried with my mouse but nothing happens. How can I "debug" this ? – Victor Lamoine May 19 '13 at 18:51
  • @VictorL I edited my answer. Is tested, so it should work. – Radu Rădeanu May 29 '13 at 7:15
3

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 in PROGRAM, TEST, RUN or IMPORT.

  • 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'"

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.