Czy istnieje sposób automatycznej aktywacji skryptu po podłączeniu urządzenia USB?

12

Mam urządzenie USB (aparat POV), które zbiera dużo danych i regularnie zapełnia pamięć. Celem jest napisanie skryptu, który:

  1. Nasłuchuje połączenia urządzenia przez USB
  2. Montuje go jako urządzenie magazynujące
  3. Pobiera dane z urządzenia
  4. Bezpiecznie odmontowuje urządzenie w celu usunięcia (po zakończeniu pobierania)

Mogę później dodać do skryptu opcję migania diod LED podłączonych do niektórych pinów GPIO, aby wskazać status ...

Szukałem „jak automatycznie pobierać dane z urządzenia USB” na Ubuntu i innych stronach z linuksem, ale bez rezultatów. Czy ktoś może podać punkt wyjścia? Nie mam nic przeciwko pisaniu kodu z dokumentacji i przykładów.

użytkownik3.1415927
źródło

Odpowiedzi:

13

Użyj reguł udev .

znajdź informacje o swoim urządzeniu.

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"

Następnie utwórz plik reguł udev dla swojego urządzenia. Podczas tworzenia pliku reguł użyj informacji uzyskanych z komendy udevinfo.

zawartość /etc/udev/rules.d/99-mydevice.rules

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

Utwórz skrypt, który będzie działał jako podłączone urządzenie USB

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

Przeładuj reguły udev

udevcontrol reload_rules

Sprawdź to. odłączyć / podłączyć

gurcanozturk
źródło
1
Próbowałem uruchomić udevinfo, ale otrzymałem -bash: udevinfo: command not foundodpowiedź z powłoki ssh. Sprawdziłem mani jest manwpis dla udev, ale nie dla udevinfo. Prawdopodobnie postaram się to osiągnąć udev... Twoja odpowiedź była pomocna, więc dzięki! Rozejrzę się, żeby to sprawdzić udevinfo, może nie zainstalowałem repozytorium ani czegoś takiego.
user3.1415927
1
@ user3.1415927 Z powodu udevinfo zastąpionego przez udevadm w debianie zaktualizowałem moją odpowiedź.
gurcanozturk
2

Jeśli nie lubisz udev, możesz rzucić okiem na devmon .

Umożliwia te opcje:

--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
źródło