Existe uma maneira de ativar automaticamente um script quando um dispositivo USB se conecta?

12

Eu tenho um dispositivo USB (câmera POV) que coleta muitos dados e enche seu armazenamento regularmente. O objetivo é escrever um script que:

  1. Escuta o dispositivo se conectar via USB
  2. Monta-o como um dispositivo de armazenamento
  3. Baixa dados do dispositivo
  4. Desmonta com segurança o dispositivo para remoção (após a conclusão do download)

Mais tarde, posso adicionar ao script a opção de LEDs piscando anexados a determinados pinos no GPIO para indicar o status ...

Eu procurei por "como baixar dados automaticamente de um dispositivo usb" no ubuntu e em outros sites linux, mas sem resultados. Alguém pode fornecer um ponto de partida? Estou confortável em escrever código de documentação e exemplos.

user3.1415927
fonte

Respostas:

13

Use as regras do udev .

encontre as informações do seu dispositivo.

udevadm -a -p /dev/path/device/

KERNELS=="1-3"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
...
ATTRS{quirks}=="0x0"
ATTRS{authorized}=="1"
ATTRS{manufacturer}=="SANDisk"
ATTRS{product}=="USB DISK"
ATTRS{serial}=="SD71011000019113"

Em seguida, crie seu arquivo de regras do udev para o seu dispositivo. Ao criar um arquivo de regras, use as informações obtidas do comando udevinfo.

conteúdo de /etc/udev/rules.d/99-mydevice.rules

SUBSYSTEMS=="usb", ATTRS{serial}=="SD71011000019113", RUN+="/home/gurcan/sync.sh"

Crie seu script que será executado como dispositivo USB conectado

#!/bin/bash
#
rsync -avz /media/disk/photos/ /data/photos/

Recarregar regras do udev

udevcontrol reload_rules

Teste-o. desconecte / conecte

gurcanozturk
fonte
1
Tentei executar o udevinfo, mas obtive uma -bash: udevinfo: command not foundresposta do shell ssh. Eu verifiquei mane há uma manentrada para udev, mas não para udevinfo. Eu provavelmente tentarei prosseguir com isso udev... sua resposta foi útil, então, obrigado! Vou procurar udevinfotambém, talvez não tenha instalado um repositório ou algo assim.
user3.1415927
1
@ user3.1415927 Por causa do udevinfo substituído pelo udevadm no debian, atualizei minha resposta.
gurcanozturk
2

Se você não gosta do udev, pode dar uma olhada no devmon .

Ele permite estas opções:

--exec-on-device DEVICE "COMMAND" Execute COMMAND after mounting DEVICE --exec-on-label "LABEL" "COMMAND" Execute COMMAND after mounting LABEL --exec-on-video "COMMAND" Execute COMMAND after video DVD mount --exec-on-audio "COMMAND" Execute COMMAND after audio CD insertion --exec-on-disc "COMMAND" Execute COMMAND after data CD/DVD mount --exec-on-drive "COMMAND" Execute COMMAND after drive mount --exec-on-unmount "COMMAND" Execute COMMAND after unmount --exec-on-remove "COMMAND" Execute COMMAND after drive removal Where the following in COMMAND will be replaced with: %d mount point directory (eg /media/cd) %f device name (eg /dev/sdd1) %l label of mounted volume Multiple --exec-on-XXX options may be used to execute multiple commands. Other exec-on-XXX commands are ignored if exec-on-device or -label executed.

kotrfa
fonte