Se desideri eseguire lo script su un dispositivo specifico, puoi utilizzare gli ID fornitore e prodotto
-
In
/etc/udev/rules.d/test.rules
:ATTRS{idVendor}=="152d", ATTRS{idProduct}=="2329", RUN+="/tmp/test.sh"
-
in
test.sh
:#! /bin/sh env >>/tmp/test.log file "/sys${DEVPATH}" >>/tmp/test.log if [ "${ACTION}" = add -a -d "/sys${DEVPATH}" ]; then echo "add ${DEVPATH}" >>/tmp/test.log fi
Con env
, puoi vedere quale ambiente è impostato da udev e con file
, scoprirai il tipo di file.
Gli attributi concreti per il tuo dispositivo possono essere scoperti con lsusb
lsusb
dà
...
Bus 001 Dispositivo 016:ID 152d:2329 JMicron Technology Corp. / JMicron USA Technology Corp. JM20329 SATA Bridge
...
Non si tratta direttamente della tua domanda, ma di quello che stai facendo. Se avvii uno script di backup da udev, dovrai affrontare due problemi principali:
- Il tuo script potrebbe essere avviato prima che il dispositivo sia pronto e possa essere montato, devi mantenere la condizione KERNEL=="sd*" se vuoi usare il nodo /dev per montarlo
- Ancora più importante, se il tuo script impiega un po' di tempo per essere eseguito (cosa che può facilmente accadere con uno script di backup) verrà terminato poco dopo l'avvio (circa 5 secondi)
- Dovrai affrontare molti complicati problemi di autorizzazione utente
Il mio consiglio è di creare uno script nella tua home utente che ascolti una named pipe e che verrà avviato in modo asincrono come :
#!/bin/bash
PIPE="/tmp/IomegaUsbPipe"
REMOTE_PATH="/path/to/mount/point"
LOCAL_PATH="/local/path/"
doSynchronization()
{
#your backup here
}
trap "rm -f $PIPE" EXIT
#If the pipe doesn't exist, create it
if [[ ! -p $PIPE ]]; then
mkfifo $PIPE
fi
#If the disk is already plugged on startup, do a syn
if [[ -e "$REMOTE_PATH" ]]
then
doSynchronization
fi
#Make the permanent loop to watch the usb connection
while true
do
if read line <$PIPE; then
#Test the message read from the fifo
if [[ "$line" == "connected" ]]
then
#The usb has been plugged, wait for disk to be mounted by KDE
while [[ ! -e "$REMOTE_PATH" ]]
do
sleep 1
done
doSynchronization
else
echo "Unhandled message from fifo : [$line]"
fi
fi
done
echo "Reader exiting"
Nota:utilizzo il montaggio automatico con kde, quindi controllo la visualizzazione della cartella. Puoi passare il parametro /dev/sd* nel fifo dalla regola udev e montarlo tu stesso nello script. Per scrivere nel fifo non dimenticare che udev non è una shell e che il reindirizzamento non funziona. Il tuo RUN dovrebbe essere come :
RUN+="/bin/sh -c '/bin/echo connesso>> /tmp/IomegaUsbPipe'"
Ho pubblicato una soluzione su https://askubuntu.com/a/516336 e sto anche copiando e incollando la soluzione qui.
Ho scritto uno script Python usando pyudev che lascio in esecuzione in background. Quello script ascolta gli eventi udev (quindi, è molto efficiente) ed esegue il codice che voglio. Nel mio caso, esegue xinput
comandi per configurare i miei dispositivi (collegamento alla versione più recente).
Ecco una versione breve dello stesso script:
#!/usr/bin/env python3
import pyudev
import subprocess
def main():
context = pyudev.Context()
monitor = pyudev.Monitor.from_netlink(context)
monitor.filter_by(subsystem='usb')
monitor.start()
for device in iter(monitor.poll, None):
# I can add more logic here, to run different scripts for different devices.
subprocess.call(['/home/foo/foobar.sh', '--foo', '--bar'])
if __name__ == '__main__':
main()