staging.inyokaproject.org

Abfrage USB-Stick gesteckt + Mount-Problem

Status: Ungelöst | Ubuntu-Version: Ubuntu 16.04 (Xenial Xerus)
Antworten |

lendl

Anmeldungsdatum:
5. Juli 2008

Beiträge: Zähle...

Hallo Leute,

ich habe einen Raspberry mit Ubuntu drauf und möchte seriell eingelesene Daten auf einen (beliebigen) USB-Stick schreiben.

Damit der Stick immer unter dem gleichen Namen erscheint, habe ich folgende Regel unter

/etc/udev/rules.d/80-usbdevice.rules

erstellt:

1
RUN+="/bin/mount -t vfat -o uid=0,gid=46,umask=000 /dev/disk/by-path/platform-3f980000.usb-usb-0:1.5:1.0-scsi-0:0:0:0-part1 /home/mensa/stick"

Das funktioniert auch ganz gut.

Danach starte ich das Programm, das die seriellen Daten einliest:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/usr/bin/python
# coding: utf8
import time
import serial

ser = serial.Serial("/dev/ttyAMA0")
ser.baudrate = 9600
x = 0
while 1:
        i=ser.readline()
        if (x == 1):
                try:
                        File_Obj = open("/home/mensa/stick/reading.txt", "a")
                        File_Obj.write(i)
                        File_Obj.close
                except:
                        ser.write("F")
                        print("end with errors")

        if ("record stop" in i):
                print "record stop"
                x = 0
        else:
                print i
        if ("record start" in i):
                print "record start"
                x = 1
        else:
                print i
# ENDE

Auch das funktioniert ganz gut. Wenn der Befehl "record start" kommt, dann fängt das Programm an, die Daten auf den USB-Stick zu schreiben. Bei "record stop" hört es auf.

Soweit so schlecht, aber wenn ich keinen USB-Stick stecken habe, dann wird mir unter dem Pfad

/home/mensa/stick/

einfach eine Datei "reading.txt" erstellt und die Daten werden da reingeschrieben.

Was mache ich falsch, bzw. wie kann ich das verhindern?

Wäre super, wenn Ihr mir helfen könntet, auch wenn das hier kein Raspberry-Forum ist. Vielen Dank vorab!

Bearbeitet von rklm:

Warum benutzt Ihr eigentlich nicht das passende Syntaxhighlighting?

dingsbums

Anmeldungsdatum:
13. November 2010

Beiträge: 3793

Erstell doch einfach auf den benutzen Sticks eine Prüfdatei, deren Existenz du abfragst:

1
2
3
if [ ! -f /home/mensa/stick/prüfdatei ]
   then exit
fi

Alternativ prüfen, ob unter /home/mensa/stick etwas gemounted ist:

1
2
3
4
mount | grep "/home/mensa/stick" &>/dev/null
if [ ! $? -eq 0]
   then exit
fi

lendl

(Themenstarter)

Anmeldungsdatum:
5. Juli 2008

Beiträge: 52

Danke für die Hilfe!

Leider ist die erste Version mit der Prüfdatei nicht so einfach, da es verschiedene, teilweise neue, USB-Sticks sein können.

Die zweite Version habe ich unter Python auch nicht zum laufen gebracht.

Ich habe es jetzt so gemacht:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/usr/bin/python
# coding: utf8
import time
import serial
import os
ser = serial.Serial("/dev/ttyAMA0")
ser.baudrate = 9600
x = 0

if os.path.ismount('/home/mensa/stick'):
        print("okeyyyyyy")
else:
        print("NIX mounted")

Das funktioniert auch, leider nur einmal:

Wenn ich also nach einem Neustart meinen Script laufen lassen, dann erkennt er, ob ein Stick gemounted ist oder nicht. Nachdem ich den Stick einmal ein- und wieder ausgesteckt habe, wird er immer "erkannt"

Irgendwas mache ich noch falsch. Kennt sich jemand mit

os.path.ismount

aus?

Vielen Dank!

Bearbeitet von rklm:

Syntaxhighlighting

dingsbums

Anmeldungsdatum:
13. November 2010

Beiträge: 3793

Die zweite Version habe ich unter Python auch nicht zum laufen gebracht.

Dann starte doch dein Python-Skript aus dem Bash-Skript, wenn unter /home/mensa/stick eine Partition auf einem USB-Medium gemounted ist.

1
2
3
4
5
6
7
8
9
mountpfad="/home/mensa/stick"

for device in $(ls /dev/sd*[1-9]);do
   udevadm info -a -p $(udevadm info -q path -n $device) | grep -i usb &>/dev/null
   if [ "$(mount | grep $mountpfad | awk '{print $1}')" == "$device" ];then
     echo $device ist verbunden nach $mountpfad
     # hier python-skript aufrufen
   fi
done

lendl

(Themenstarter)

Anmeldungsdatum:
5. Juli 2008

Beiträge: 52

Da habe ich gleich zwei Fragen dazu:

  1. Wie rufe ich das Python-Script aus dem Bash-Script auf?

2. wenn ich den Bash-Script laufen lasse und es ist kein Stick gesteckt, kommt folgende Meldung:

ls: cannot access '/dev/sd*[1-9]': No such file or directory

Ist das richtig?

Wenn ein Stick gesteckt ist, dann läuft der Script 3 Sekunden, gibt aber nichts aus.

dingsbums

Anmeldungsdatum:
13. November 2010

Beiträge: 3793

Wie rufe ich das Python-Script aus dem Bash-Script auf?

siehe unten

wenn ich den Bash-Script laufen lasse und es ist kein Stick gesteckt, kommt folgende Meldung:

ls: cannot access '/dev/sd*[1-9]': No such file or directory

Hast du eine nvme-SSD? Die verewigen sich wohl nicht unter /dev/sd*. Ich habe das Skript entsprechend angepasst.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#! /bin/bash

# hier eigene pfade anpassen
mountpoint="/home/mensa/stick"
pythonskript="/pfad/zum/python.py"


usbgeraetepfad="/dev/sd*"


dummy=$(ls $usbgeraetepfad &>/dev/null)
if [ ! $? -eq 0 ]; then
   echo $usbgeraetepfad nicht gefunden, abbruch
   exit 1
fi

if [ ! -d "$mountpoint" ];then
   echo ordner $mountpoint existiert nicht, abbruch
   exit 1
fi

if [ ! -f "$pythonskript" ];then
   echo datei $pythonskript existiert nicht, abbruch
   exit 1
fi

for device in $(ls /dev/sd*[1-9]);do
   udevadm info -a -p $(udevadm info -q path -n $device) | grep -i usb &>/dev/null
   if [ "$(mount | grep $mountpoint | awk '{print $1}')" == "$device" ];then
     echo $device ist verbunden nach $mountpoint
     echo pythonskript $pythonskript wird gestartet  ...
     python $pythonskript
   else
     echo $device ist nicht verbunden nach $mountpoint
   fi
done

Bei mir tut es so. Ich hoffe, bei dir auch.

lendl

(Themenstarter)

Anmeldungsdatum:
5. Juli 2008

Beiträge: 52

es funktioniert leider immer noch nicht.

Das Script erkennt den USB-Gerätepfad SDx und bringt die passende Fehlermeldung wenn kein Stick drin ist:

/dev/sd* nicht gefunden, abbruch

Die Abfrage nach dem Python-Script funktioniert auch, da hatte ich mich verschrieben. Allerdings funktioniert die Abfrage des Mountpoints irgendwie nicht. Es kommt immer die Meldung:

/dev/sdb1 ist nicht verbunden nach /home/mensa/stick

Der Stick ist da aber gemountet, ich kann die Daten darauf sehen. Leider verstehe ich die Syntax nicht so ganz, deswegen tue ich mich schwer mit der Fehlersuche. Wie kann ich denn rausfinden, was da schief geht?

Vielen Dank!

dingsbums

Anmeldungsdatum:
13. November 2010

Beiträge: 3793

lendl schrieb:

Es kommt immer die Meldung:

/dev/sdb1 ist nicht verbunden nach /home/mensa/stick

Der Stick ist da aber gemountet, ich kann die Daten darauf sehen.

Dann zeig mal bitte bei gemountetem Stick die Ausgabe von

df -h
Antworten |