Using udev rules to run a script on USB insertion

I'm trying to set up a script to run every time I plug in a USB device. I created the file /etc/udev/rules.d/90-local.rules and added the following rule:

ACTION=="add", SUBSYSTEM=="usb", KERNEL=="sd*", SYSFS{model}=="Cruzer*", RUN+="sh /home/jesse/Documents/Scripts/cruzer.sh"

The problem is that when the drive is connected, nothing happens. The script, for debugging purposes, is rigged to send a notification with notify-send, which is installed and works fine from the terminal.

The path to the script is correct, as I've run that exact command in the terminal without any troubles.


I had the same problem. This worked for me:

Try to copy your script into /usr/local/bin and change the directory in your .rules file.

Also, I don't know what SYSFS is, but I would prefer to use the ATTR properties.

The following line is the content of my .rules file:

ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[a-z]1", ATTRS{vendor}=="SanDisk ", RUN+="/usr/local/bin/backup.sh"

notify-send requires access to your DBus session bus, which it cannot have for two reasons:

  • No information about the session. When started by udev, your script knows nothing about where you are logged in or if you're logged in at all. Multi-seat with X11 is still tricky, but user switching works for both X11 and console sessions. Many people also use SSH, VNC and NX over the network.

    (DISPLAY=:0 would work half of the time, but that's still guessing at best.)

  • Denied by DBus policy. Even if your script somehow finds your X11 session, it will not be able to send notifications due to the script being run as root instead of your user account.