Testen ob USB device existiert

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
gugus
Beiträge: 385
Registriert: 04.09.2002 17:41:17
Wohnort: da wo ich zu Hause bin

Testen ob USB device existiert

Beitrag von gugus » 13.09.2018 18:02:24

Hallo zusammen
Wird ein USB Gerät angesteckt wird normalerweise ein Device oder Symlink in /dev/ erstellt.
Wie stelle ich fest ob das Device/Symlink auch erstellt wurde.
Ja, mit script und -L kann man testen ob ein Symlink erstellt wurde.

Ist dies die einzige "richtige" Möglichkeit oder gibt es noch etwas eleganteres.

Gruss
Gugus

willy4711

Re: Testen ob USB device existiert

Beitrag von willy4711 » 13.09.2018 19:58:15

z.B

Code: Alles auswählen

mount |grep sdx

ren22

Re: Testen ob USB device existiert

Beitrag von ren22 » 13.09.2018 22:47:25

auszug aus einem meiner scripte...

Code: Alles auswählen

#!/bin/bash

#usb-Sony_Storage_Media_2A08012428619
HARDSERIALNUMBER=2A08012428619 #serial number of device
DEVICE=$(ls -l /dev/disk/by-id/ | grep -i "$HARDSERIALNUMBER" | awk '{print $11}' | sed "s|^\../../||" | sed 's/[0-9]*//g')
DEVICE=$(echo $DEVICE | awk '{print $1}') 
SERIALNUMBER=$(udevadm info --name=/dev/$DEVICE 2>/dev/null | grep SHORT | cut -d'=' -f2 ) 
#echo $SERIALNUMBER
#echo $DEVICE 

#************************************************************#
#####check that the Sony Usb stick is connect to the host#####
#************************************************************#
if [ "$SERIALNUMBER" == "$HARDSERIALNUMBER" ] ; then 
        echo "Sony USB Storage device [$DEVICE] found.   OK" 
    else
        echo "!!! Sony USB Storage device not found. Aborting!!!" 
        exit 1
fi

Benutzeravatar
Tintom
Moderator
Beiträge: 3066
Registriert: 14.04.2006 20:55:15
Wohnort: Göttingen

Re: Testen ob USB device existiert

Beitrag von Tintom » 14.09.2018 08:52:08

Viele Wege führen nach Rom und dementsprechend viele richtige Möglichkeiten gibt es. Dieses Skript ist auf den ersten Blick nicht falsch und sofern es tut was es soll, wäre für mich alles in Ordnung.
Wenn Du mit „elegantere Lösung“ aber Optimierungsbedarf meinst, dann würde ich wie folgt ansetzen:
Du rufst in deinem Skript fünf (!) externe Programme auf um eine einfache Bedingung zu testen ('echo' habe ich nicht mitgezählt, da shell-builtin). Das kostet neben unnötiger Zeit auch unnötig Arbeitsspeicher.
Die Bedingung "Gerät existiert: ja/nein" geht auch einfacher zu testen, denn die Abfragebedingung ist ja mit $HARDSERIALNUMBER unveränderlich vorgegeben. Da udev bei Anschluss eines Speichermediums automatisch einen Link unter /dev/disk/ anlegt, würde ich auch nur dessen Existenz testen, also:

if [ -e ${HARDSERIALNUMBER} ]; then
...


EDIT: Mit dem Programm time <SKRIPTNAME.sh> kannst Du die Zeitersparnis messen, die die Optimierung gebracht hat

gugus
Beiträge: 385
Registriert: 04.09.2002 17:41:17
Wohnort: da wo ich zu Hause bin

Re: Testen ob USB device existiert

Beitrag von gugus » 14.09.2018 21:42:31

Also, eigentlich möchte ich vor dem mounten sicherstellen dass der symlink auch da ist.
Ich hatte schon mehrfach Probleme da ein USB Laufwerk das zuerst eingeschaltet wurde etwas länger zum Starten hatte.

Code: Alles auswählen

# Steckdose einschalten
sisctrl -o1

# warten bis Laufwerk den Symling via UDEV erstellt hat 

USBDEV=/dev/usb-dev

while [ ! -L $USBDEV ]; do
  sleep 1;
done

# Mounten
mount .......
wäre dies ok so ?

Gruss
gugus

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Testen ob USB device existiert

Beitrag von rendegast » 15.09.2018 11:44:09

Meine Herangehensweise,
dem Dateisystem einen (idle-)Automounter verpassen (egal ob systemd oder autofs),
auf Basis von UUID oder gegebenenfalls aussagekräftigerem LABEL.
Auf das Dateisystem eine beliebige "Lock"-Datei.
Das Skript bekommt einen Test derart

Code: Alles auswählen

GOOD=$(mktemp); echo no > $GOOD
#GOOD=$(tempfile); echo no > $GOOD
seq 1 10 | while read XX; do [ -f /pfad/LockDatei ] && { echo yes > $GOOD; break; }; sleep 1; done
[ "xyes" = "x$(cat $GOOD)" ] && { mache Backup; }
rm $GOOD
also ob das Dateisystem effektiv zur Verwendung bereitsteht.
(EDIT Es wird jede Sekunde eine Erkennung der LockDatei versucht, was den Automount auslösen sollte.
Bei erfolgter Erkennung wird die eigentliche Funktion ausgeführt (hier als Beispiel 'mache Backup').
Die Speicherung des Zustands im tempfile, da ich dann nicht auf saubere Variablenübergabe aus der Subshell achten muß.)



3 externe Tools tempfile/mktemp, seq und sleep.
Der Zähler 'seq ... | while ...' vielleicht ohne externes Tool

Code: Alles auswählen

for XX in 1 2 3 4 5 6 7 8 9 10 ; do ...
oder
ls -1 /dev/tty* | while read XX do; ...
Zuletzt geändert von rendegast am 15.09.2018 23:03:42, insgesamt 1-mal geändert.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

gugus
Beiträge: 385
Registriert: 04.09.2002 17:41:17
Wohnort: da wo ich zu Hause bin

Re: Testen ob USB device existiert

Beitrag von gugus » 15.09.2018 21:39:06

mmhhpff ....oh my GOOD
Das muss ich erst einmal verdauen....
:mrgreen:

willy4711

Re: Testen ob USB device existiert

Beitrag von willy4711 » 16.09.2018 09:47:57

Ich weiß nicht, warum man das immer so kompliziert machen muss.
Mal was für Linux- Dummies (natürlich mit Auto Mount):
Starter erstellen mi (Debiantilix ist mein Liebling :mrgreen: )

Code: Alles auswählen

tilix -e "journalctl -f"
Klick - und schon kann man live beobachten, ob alles korrekt funktioniert: :mrgreen:

Code: Alles auswählen

Sep 16 09:28:05 debxfce kernel: usb 10-2: new SuperSpeed Gen 1 USB device number 2 using xhci_hcd
Sep 16 09:28:05 debxfce kernel: usb 10-2: New USB device found, idVendor=0951, idProduct=1666, bcdDevice= 0.01
Sep 16 09:28:05 debxfce kernel: usb 10-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Sep 16 09:28:05 debxfce kernel: usb 10-2: Product: DataTraveler 3.0
Sep 16 09:28:05 debxfce kernel: usb 10-2: Manufacturer: Kingston
Sep 16 09:28:05 debxfce kernel: usb 10-2: SerialNumber: 60A44C425490F161170B1653
Sep 16 09:28:05 debxfce kernel: usb-storage 10-2:1.0: USB Mass Storage device detected
Sep 16 09:28:05 debxfce kernel: scsi host6: usb-storage 10-2:1.0
Sep 16 09:28:05 debxfce mtp-probe[7017]: checking bus 10, device 2: "/sys/devices/pci0000:00/0000:00:0a.0/0000:04:00.0/usb10/10-2"
Sep 16 09:28:05 debxfce mtp-probe[7017]: bus: 10, device: 2 was not an MTP device
Sep 16 09:28:06 debxfce kernel: scsi 6:0:0:0: Direct-Access     Kingston DataTraveler 3.0      PQ: 0 ANSI: 6
Sep 16 09:28:06 debxfce kernel: sd 6:0:0:0: Attached scsi generic sg6 type 0
Sep 16 09:28:06 debxfce kernel: sd 6:0:0:0: [sdf] 15109516 512-byte logical blocks: (7.74 GB/7.20 GiB)
Sep 16 09:28:06 debxfce kernel: sd 6:0:0:0: [sdf] Write Protect is off
Sep 16 09:28:06 debxfce kernel: sd 6:0:0:0: [sdf] Mode Sense: 4f 00 00 00
Sep 16 09:28:06 debxfce kernel: sd 6:0:0:0: [sdf] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
Sep 16 09:28:06 debxfce kernel:  sdf: sdf1
Sep 16 09:28:06 debxfce kernel: sd 6:0:0:0: [sdf] Attached SCSI removable disk
Sep 16 09:28:12 debxfce systemd[1]: Started Clean the /media/willy/76EB-E8E7 mount point.
Sep 16 09:28:12 debxfce udisksd[690]: Mounted /dev/sdf1 at /media/willy/76EB-E8E7 on behalf of uid 1000
Und gut ist. Oder ?

Edit:
Das ganze kann man dann auch noch in einen 3-Zeiler verpacken (wegen der Bildchen) :

Code: Alles auswählen

#!/bin/bash

xterm -e 'journalctl -n40>~/mounted'
cat ~/mounted |grep Mounted>~/Mountergebnis
notify-send -t 300000 "$(basename ~/Mountergebnis)" "$(cat ~/Mountergebnis)"

exit
1859

Antworten