Testen ob USB device existiert
Testen ob USB device existiert
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
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
Re: Testen ob USB device existiert
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
Re: Testen ob USB device existiert
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
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
Re: Testen ob USB device existiert
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.
wäre dies ok so ?
Gruss
gugus
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 .......
Gruss
gugus
Re: Testen ob USB device existiert
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 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
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
(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")
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")
Re: Testen ob USB device existiert
mmhhpff ....oh my GOOD
Das muss ich erst einmal verdauen....
Das muss ich erst einmal verdauen....
Re: Testen ob USB device existiert
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 (tilix ist mein Liebling )
Klick - und schon kann man live beobachten, ob alles korrekt funktioniert:
Und gut ist. Oder ?
Edit:
Das ganze kann man dann auch noch in einen 3-Zeiler verpacken (wegen der Bildchen) :
Mal was für Linux- Dummies (natürlich mit Auto Mount):
Starter erstellen mi (tilix ist mein Liebling )
Code: Alles auswählen
tilix -e "journalctl -f"
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
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