Si desea ejecutar el script en un dispositivo específico, puede usar las identificaciones de proveedor y producto
-
En
/etc/udev/rules.d/test.rules
:ATTRS{idVendor}=="152d", ATTRS{idProduct}=="2329", RUN+="/tmp/test.sh"
-
en
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
, puede ver qué entorno está configurado desde udev y con file
, descubrirá el tipo de archivo.
Los atributos concretos de su dispositivo se pueden descubrir con lsusb
lsusb
da
...
Bus 001 Dispositivo 016:ID 152d:2329 JMicron Technology Corp. / JMicron USA Technology Corp. JM20329 Puente SATA
...
No se trata directamente de tu pregunta, sino de lo que estás haciendo. Si inicia un script de copia de seguridad desde udev, se enfrentará a dos problemas principales:
- Su secuencia de comandos podría iniciarse antes de que el dispositivo esté listo y pueda montarse, debe mantener la condición KERNEL=="sd*" si desea utilizar el nodo /dev para montarlo
- Más importante aún, si su secuencia de comandos tarda algún tiempo en ejecutarse (lo que puede ser fácilmente el caso con una secuencia de comandos de respaldo), se eliminará poco después de que se inicie (alrededor de 5 segundos)
- Enfrentará muchos problemas complicados de permisos de usuario
Mi consejo es crear una secuencia de comandos en su casa de usuario que escuche una canalización con nombre y que se iniciará de forma asíncrona como:
#!/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:uso el montaje automático con kde, así que verifico que aparezca la carpeta. Puede pasar el parámetro /dev/sd* en el fifo de la regla udev y montarlo usted mismo en el script. Para escribir en el fifo no olvides que udev no es un shell y que la redirección no funciona. Tu RUN debería ser como:
EJECUTAR+="/bin/sh -c '/bin/echo conectado>> /tmp/IomegaUsbPipe'"
He publicado una solución en https://askubuntu.com/a/516336 y también estoy copiando y pegando la solución aquí.
Escribí un script de Python usando pyudev que dejo ejecutándose en segundo plano. Ese script escucha los eventos de udev (por lo tanto, es muy eficiente) y ejecuta cualquier código que yo quiera. En mi caso, ejecuta xinput
comandos para configurar mis dispositivos (enlace a la versión más reciente).
Aquí hay una versión corta del mismo 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()