3

I have a Ubuntu server with a external USB hard drive.

I basically just want to run a script whenever the hard drive is plugged in.

What would be the optimal way to achieve this ?

h3.
  • 189
  • 3
  • 9

2 Answers2

12

You can add a udev rule for your specific device -- to do this, create a file called /etc/udev/010custom.rules (or something similar; just make sure numerically it is the smallest in the directory). The files contents will be:

BUS="usb", SYSFS{idVendor}="**IDVENDOR**", SYSFS{product}="**PRODUCT**", NAME="usb/%k", SYMLINK="DEVICE"
RUN+="/path/to/your/script"

Replace the bolded keywords with the values for your device from lsusb:

Bus 005 Device 002: ID 0b05:b700 ASUSTek Computer, Inc. Broadcom Bluetooth 2.1

The first bold field above is IDVENDOR, and the second bold field is PRODUCT.

As for DEVICE, you can define this yourself; it will create a /dev/ node which is a symlink to any device that fits the criteria above (so, if you put foobar as the SYMLINK, udev will create a /dev/foobar which is a symlink to your USB device).

Note: I haven't tried this myself as I don't have any removable USB devices, but it should work. If you have any trouble check the udev documentation for rules.

Michael Pobega
  • 934
  • 5
  • 12
  • I apologize if my writing is hard to follow; I'm a programmer, not a linguist. – Michael Pobega Oct 15 '09 at 00:45
  • Thanks a lot, this should at least put me on the right path ;) – h3. Oct 15 '09 at 02:33
  • You may want to note that RUN is meant to be on a newline, separate from BUS-SYMLINK -- ServerFault is just kind of weird with how it handles newlines, so I added a code tag. – Michael Pobega Oct 15 '09 at 03:29
  • Oh.. I just added it at the end with a coma and it worked fine. However the script is called as expected .. but more than once. It's called like 15 times. I use the product and the device serial to match the device so I don't understand why. – h3. Oct 15 '09 at 12:50
  • That's a bit weird. Why not have the script create some sort of lock file in /tmp telling it not to run more than once? So, something like 'if file /tmp/usb-lock exists exit, else run script' – Michael Pobega Oct 15 '09 at 17:14
  • Yeah that's basically the workaround I planned to use.. thanks – h3. Oct 15 '09 at 18:12
  • 1
    the RUN needs to be on the end of the same line; each UDEV rule is one line. the BUS-SYMLINK stuff acts as a filter to select the device that the RUN statement will be executed on. if RUN is on its own line, it'll get added to (and thus run for) every device. – quack quixote Nov 03 '09 at 11:27
1

It is likely that you'll want to look at udev. Unfortunately, you've just witnessed me exhaust my knowledge of it.

Dennis Williamson
  • 62,149
  • 16
  • 116
  • 151