-   Linux - Desktop (
-   -   Running a script when auto-mounter detects USB thumb-drive insertion... (

Bane73 02-14-2007 06:43 PM

Running a script when auto-mounter detects USB thumb-drive insertion...
Knowing linux, I know there has got to be a way to do this... however, not knowing linux well enough, I'm not sure how to go about it :scratch: Hopefully someone here can point me down the right path...

I have a script I run that sync's the contents of my USB thumb-drive to a directory on my harddrive and it works great... however, it's annoying to run... I'd like to find out what script the auto-mounter runs when I insert the USB stick so that I can see if I can just call my script from the end of the auto-mounter's script and thus sync my stuff automatically whenever I insert the stick... any ideas???

It may not matter, but for reference, I'm running openSUSE 10.2


jschiwal 02-14-2007 07:35 PM

Which desktop are you using. If it is KDE, a popup appears asking what you want to do. I think that could add an entry to the dialog and configure it to run your sync command.

There is a HAL helper script that I saw once, but I'm not certain under what circumstances it is called. Using "locate" might help pin it down. Also look at the process listing. I think there is a KDE daemon involved as well, which allows the user to graphically control the course of action to take.

cordel 07-13-2007 10:01 PM

You can do this by useing udev rules:
Plug your thumbdrive in, and
cat /proc/scsi/usb-storage/*

You should find an entry for it similar to this:
Host scsi7: usb-storage
Vendor: Memorex
Serial Number: 07751F9402C9
Protocol: Transparent SCSI
Transport: Bulk

Now, with either the serial number or the vendor/model combo, you can write the rule. The rule creates a symlink for the device in the /dev tree, for example, /dev/TRAVELDRIVE

create a text file in /etc/udev/rules.d called 95.usbbackup.rules. You can use a number other than 95, but keep in mind that udev processes rules in alphanumeric order, and it's better to have local rules processed last.

If you have a serial number, type a rule like this (all on one line) into the file, and save it:

BUS="usb", SYSFS{serial}="07751F9402C9", SYMLINK="TRAVELDRIVE", RUN+="/usr/local/bin/ [Options if your script has them] "

You can string as many SYSFS{} entries together as you need to identify the drive uniquely.

BUS="scsi", SYSFS{vendor}==" Memorex", SYSFS{product}=="TRAVELDRIVE 005B ", SYMLINK="TRAVELDRIVE", RUN+="/usr/local/bin/"

Your rule now fires every time you plug in your thumbdrive.

happyslacker 07-17-2007 04:30 PM

See the source of vsupdfstab-0.1-noarch-0.tgz:



# /etc/vsupdfstab.udev
# версия от 08.05.2006 г. 20:35

# Този скрипт добавя във файла /etc/fstab запомнящите устройства
# (памети и фотоапарати на USB), малко след момента в който се включат
# към системата и ги премахва от /etc/fstab, когато бъдат премахнати.
# Устройството не се монтира с опция "sync", защото това намалява драстично
# живота на паметта. Също така се ползва опция noatime, която допълнително
# увеличава живота на паметта.
# Преди да се извади устройството трябва ръчно да се напише команда sync или
# да се демонтира. При изваждане на устройството този скрипт  го демонтира,
# но тогава вече ще е късно, ако потребителя не го е демонтирал ръчно или
# не е написал команда sync.
# Допускаме, че $DEVNAME винаги е истинския път към устройството (а не път към
# негова символна връзка). Ако това не е така, скрипта няма да работи (обаче не вярвам
# udevd да дава път към връзка).
# Този скрипт нарочно не монтира дяловете, защото това не е съвместимо с КДЕ:

if [ -z "$DEVNAME" -a -z "$SUBSYSTEM" -o -z "$DEVPATH" -o -z "$ACTION" ]; then
  echo "This script must be called by udevd because it needs the following environment variables: DEVPATH, ACTION, and DEVNAME or SUBSYSTEM"

echo "***************************">> $dev_log
date >> $dev_log
echo "Някакво събитие се е случило:" >> $dev_log
echo "DEVNAME=$DEVNAME" >> $dev_log
echo "SUBSYSTEM=$SUBSYSTEM" >> $dev_log
echo "DEVPATH=$DEVPATH" >> $dev_log
echo "ACTION=$ACTION" >> $dev_log
echo "ID_BUS=$ID_BUS" >> $dev_log
echo "ID_FS_LABEL=$ID_FS_LABEL" >> $dev_log
echo "ID_FS_LABEL_SAFE=$ID_FS_LABEL_SAFE" >> $dev_log
echo "ID_FS_TYPE=$ID_FS_TYPE" >> $dev_log
echo "ID_FS_USAGE=$ID_FS_USAGE" >> $dev_log
echo "ID_FS_UUID=$ID_FS_UUID" >> $dev_log
echo "ID_FS_VERSION=$ID_FS_VERSION" >> $dev_log
echo "ID_MODEL=$ID_MODEL" >> $dev_log
echo "ID_PATH=$ID_PATH" >> $dev_log
echo "ID_REVISION=$ID_REVISION" >> $dev_log
echo "ID_SERIAL=$ID_SERIAL" >> $dev_log
echo "ID_TYPE=$ID_TYPE" >> $dev_log
echo "ID_VENDOR=$ID_VENDOR" >> $dev_log

  echo "***************************">> $dev_log
  date >> $dev_log
  echo "$1" >> $dev_log

if [ ! "$SUBSYSTEM" = "block" ]; then
 error_msg_to_log "Хм... SUBSYSTEM не е block - изпълнението на $0 спира (команда exit 0)"
 exit 0

if [ ! "$ID_BUS" = "usb" ]; then
 error_msg_to_log "Хм... ID_BUS не е usb - изпълнението на $0 спира (команда exit 0)"
 exit 0

# $1 = устройството
clear_if_device_is() {
read sDEV sMNTP sOPT s1 s2
REAL_sDEV=`readlink -f $sDEV`
if [ "$1" = "$REAL_sDEV" ]; then
 umount $REAL_DEV
 umount $sMNTP
 umount -l $REAL_DEV
 umount -l $sMNTP
 rmdir $sMNTP
 return 1

remove_from_fstab3() {
echo -n "" > $fstab_temp
REAL_DEV=`readlink -f $1`
cat $fstab_path | while read LN;
 echo $LN | cut -d "#" -f 1 | clear_if_device_is "$REAL_DEV"
 if [ $? = 0 ]; then
  echo "$LN" >> $fstab_temp
mv "$fstab_temp" "$fstab_path"

# Добавяне на информация в /etc/fstab, че устройство $1 че ще се
# монитира в точка $2
  if [ -e "$2" -o ! -b "$1" ]; then return 1; fi # ако директорията съществува е опасно да се продължи

  if [ "$ID_FS_TYPE" = "" ]; then
  error_msg_to_log "Udevd не каза каква е файловата система на $1"
  return 1

  # auto: за да могат да се монтират с команда mount -a
  # users: за да могат да се (де)монтират от всички потребители
  # noatime,async: удължаване живота на Flash паметта

  case "$fstype" in
  ntfs) options="${options},rw,nls=utf8,fmask=111,dmask=000" ; fstype=ntfs-3g ;;
                                                              # ^^^^^^^^^^^^^^ - ако има проблеми - да се изтрие
  msdos) options="${options},fmask=111,dmask=000" ;;
  vfat) options="${options},utf8,codepage=855,fmask=111,dmask=000" ;;
  mkdir -p $2
  echo "$1 $2 $fstype $options 0 0" >> /etc/fstab


device_is_in_line() {
read sDEV sMNTP sOPT s1 s2
REAL_sDEV=`readlink -f $sDEV`
if [ "$1" = "$REAL_sDEV" ]; then
 return 1

device_is_not_added2() {
cat /etc/fstab | while read LN; do
echo $LN | device_is_in_line $1
if [ ! $? = 0 ]; then return 1 ; fi

# ще се пробва да монтира даже и /dev/???, а не само дяловете му (напр. /dev/sdb1)
# това го правим, защото някой може да е решил да си форматира паметта без да направи
# таблица на дяловете (от която няма много смисъл точно в този случай)
#if echo "$DEVNAME" |  egrep -o "^/dev/[a-z]+[0-9]+" 2>/dev/null 1>/dev/null ; then

if [ "$ACTION" = "add" ] ; then
  if device_is_not_added2 $DEVNAME; then
        MNTP_dir=`basename "$DEVNAME"`
        error_msg_to_log "Изпълнява се: add_device_to_fstab \"$DEVNAME\" \"$MNTP\""
        add_device_to_fstab "$DEVNAME" "$MNTP"
      error_msg_to_log "Нарочно няма да се добави $DEVNAME в /etc/fstab, защото вече го има там"
elif [ "$ACTION" = "remove" ] ; then
        error_msg_to_log "Изпълнява се: remove_from_fstab3 \"$DEVNAME\""
        remove_from_fstab3 "$DEVNAME"



# /etc/udev/rules.d/usbflash.rules
# Автоматично монтиране и демонтиране на USB паметите
# и автоматично вписване/изтриване от /etc/fstab.

SUBSYSTEM=="block", ACTION=="add", RUN+="/etc/vsupdfstab.udev"
SUBSYSTEM=="block", ACTION=="remove", RUN+="/etc/vsupdfstab.udev"



You must remember to unmount device (or type command "sync") before attempting to remove removable media otherwise your data may be lost - Linux does not necessarily write data to the media immediately and as such a copy command may continue to happen in the background after it has returned on the command line. When you perform an unmount (or type command "sync"), any data that is still pending is written to the device.
Warning! Do not mount flash memory with option "sync"! This will decrase the life of memory!

koodough 10-24-2008 04:08 AM

Working code example of udev auto executing
Here a working code example of udev auto executing my usb thumb drive


SUBSYSTEMS=="usb", ATTRS{serial}=="077B03B40D57", SYMLINK+="patriotUSB", RUN+="/usr/bin/beep"

Code that will beep when any USB is plugged in

SUBSYSTEMS=="usb", RUN+="/usr/bin/beep"

NOTE: you probably might not have the action beep so just download it from your package manager


I learned out do write this out correctly from this site

All times are GMT -5. The time now is 02:00 PM.