Fstab, Crontab, NAS, Automatischer Ablauf

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo Zusammen,

    ich habe leider ein kleines Problem.

    Ich würde gerne mit der RasPi Kamera Bilder machen und diese direkt auf meinem NAS speichern.

    Das ganze funktioniert auch, wenn ich es "mit der Hand" anstoße.

    Will ich aber, dass alles direkt nach einem Neustart automatisch funktioniert, gibt es Probleme.

    Ich poste jetzt mal kurz, was geht, wenn ich es von Hand starte:

    Mein Python Skript, das mir ein Bild macht mit dem aktuellen Zeitstempel als Dateiname:

    Das Bild erstellen funktioniert ohne Problem.

    Nun die Einbindung von meinem NAS:

    Code
    sudo mount -t cifs -o username=admin,password=geheim //192.168.1.10/Bilder /media


    Auch die Einbindung von meine NAS funktioniert ohne Probleme.

    Rufe ich jetzt /media auf, und speichere dort die Python Datei für die Bildaufnahme, wird alles wie gewünscht in dem Ordner auf dem NAS gespeichert.

    Sobald ich aber alles automatisch machen lassen will, über Crontab, funktioniert dies nicht mehr.

    sudo crontab -e

    Code
    */1 * * * * sudo /usr/bin/python3 /media/kamera.py


    Der Crontab selbst funktioniert. Ich sehe wie die LED der Kamera angeht und anschließend wieder aus. Auch am Desktop sehe ich, wie das Bild erscheint und wieder schließt.
    Somit gehe ich davon aus, da es genau das selbe Phänomen ist, als würde ich es per Hand starte, dass es funktioniert.

    Problem hier ist, dass das Bild nicht auf dem NAS gespeichert wird.


    Nächste Problem besteht mit FSTAB:

    Code
    //192.168.1.10/Bilder /media cifs username=admin,password=geheim


    Sobald ich über FSTAB mein NAS einbinden will, funktioniert dies leider nicht.
    Warum das so ist, da frage ich nun euch...

    Ich hoffe ich konnte es einigermaßen erklären.
    - Binde ich NAS per Hand ein und starte das Script von Hand, funktioniert alles wie es soll
    - Lass ich die Einbindung und / oder die Scripte per FSTAB / Crontab laufen, funktioniert dies leider nicht mehr.

    Danke im voraus

  • Wenn ich das richtig lese, läuft alles. Bis auf das Mounten des Shares...
    Willst du das Share jedes mal mounten, wenn ein Bild erstellt wird und danach umounten oder soll eine permanente Verbindung geschaffen werden? Ich tippe auf Letzteres, da jede Minute ein Bild übertragen werden soll. -> beim Booten einbinden.

    Bezüglich der fstab empfehle ich: https://wiki.ubuntuusers.de/Samba_Client_cifs/#Nutzung
    Es fehlen die beiden Nullen am Ende. Außerdem verwende ich gerne die Option "nofail", seit der Debian-Zweig besonders beim Booten recht kritisch auf nicht mountbare Devices reagiert. Behälst du am Ende der fstab eine Leerzeile bei?
    Sicherheitstipp: Lege die Credentials in einer Datei ab, statt sie im Klartext in die fstab zu schreiben. Die kann nämlich jeder lesen ;)

    Code
    #Eintrag mit Zugangsdaten im Klartext (sehr unsicher!)
    //<Server-IP>/<Freigabe> <Mountpoint> cifs username=<Nutzer>,passwd=<Passwort>,auto,nofail 0 0
    
    
    #Eintrag mit Übergabe der Zugangsdaten per Datei
    
    
    //<Server-IP>/<Freigabe> <Mountpoint> cifs credentials=</Pfad/zur/Datei/.Dateiname>,auto,nofail 0 0

    In der angebenen Datei steht dann folgendes:

    Code
    nano <Pfad/zur/Datei/.Dateiname> (idealerweise im Homeverzeichnis des berechtigten Users)
    
    
    #Eintrag
    username=<Benutzername für Samba-Share>
    password=<Password für den Sambabenutzer>
    Code
    #Zugriffsrechte anpassen
    chmod 600 ~/<.Dateiname>

    Mit welchem User führst du den Vorgang "händisch" aus? Führst du mit dem User auch den Befehl "crontab -e" aus?
    Dieser User hat dann wohl alle nötigen Berechtigungen. Dieser muss dann auch die Cron-Jobs ausführen.

  • Hallo,

    Du hast leider nicht geschrieben, welches OS Du auf deinen Raspberry PI installiert hast, aber es gibt ein paar die die /etc/fstab gar nicht verarbeiten - hier muss man dann einen anderen Weg gehen:

    man kann z.B. bei OpenElec die autostart zum mounten nutzen:

    nano /storage/.config/autostart.sh

    und dann z.B. entsprechen anpassen


    Code
    #! /bin/sh
    (sleep 30; \
    mount //<IP-ADR>/Verzeichnis/auf/dem/NAS/ /Einhängepunkt/ -t cifs -o noperm,iocharset=utf8,user=MYUSERNAME,pass=MYPASS,rw \
    )&


    Oder Du benutzt den Mountbefehl direkt über cron in einem Shellscript - aber dann musst ggf. noch ein paar Pfade exportieren.

  • Hallo Zusammen,

    als Betriebssystem verwende ich Raspbian.


    Wenn ich das richtig lese, läuft alles. Bis auf das Mounten des Shares...
    Willst du das Share jedes mal mounten, wenn ein Bild erstellt wird und danach umounten oder soll eine permanente Verbindung geschaffen werden? Ich tippe auf Letzteres, da jede Minute ein Bild übertragen werden soll. -> beim Booten einbinden.

    Jein.. Das Mounten funktioniert nur, wenn ich es von Hand mounte. Das heißt, ich geben den ganzen Befehle von Hand in die Kommandozeile ein und führe es aus.
    Und ja, letzteres soll der Fall sein. Die Verbindung soll permanent hergestellt werden.

    Diesen Befehl, wenn ich von Hand eingebe funktioniert das Mounten:

    Code
    sudo mount -t cifs -o username=admin,password=geheim //192.168.1.10/Bilder /media

    Wenn ich dann mein Script für die Kamera dort ausführe, dann funktioniert dies auch.

    Lasse ich aber vom System das Mounten übernehmen geht es leider nicht.
    Leider funktioniert auch das von dir vorgeschlagene Mounten nicht:

    Code
    //<Server-IP>/<Freigabe> <Mountpoint> cifs username=<Nutzer>,passwd=<Passwort>,auto,nofail 0 0

    Ich habe das Gefühl, dass die WLAN Verbindung nicht so schnell hergestellt ist, wie der RasPi den Mount machen will.

    Daher glaube ich funktioniert es nur, wenn der RasPi gestartet ist und ich es selbst eingebe.

  • Was passiert eigentlich, wenn das vorgeschlagene

    Code
    #//<Server-IP>/<Freigabe> <Mountpoint> cifs username=<Nutzer>,passwd=<Passwort>,auto,nofail 0 0
    #für dich also:
    //192.168.1.10/Bilder /media cifs username=admin,passwd=geheim,auto,nofail 0 0


    in die fstab einträgst (natürlich angepasst und ohne die spitzen Klammern) und dann ein

    Code
    sudo mount -a


    eingibst? Die Fehlermeldung respektive die Logeinträge dürften dann etwas Licht ins Dunkel bringen.

    Es kann tatsächlich sein, dass beim Booten die WLAN-Verbindung nicht früh genug zur Verfügung steht.
    Mit den obigen Schritten stellen wir folgendes sicher:
    - Der Pi ist an und betriebsbereit.
    - Die WLAN-Verbindung steht bereits.
    - Syntaxfehler fallen eher auf.

    Verzeih meine schlechten Manieren, ich habe nicht mal "Hallo" gesagt, wie mir soeben auffiel... :blush:

    Einmal editiert, zuletzt von Benandi (25. September 2016 um 12:59)

  • Zu deinem mount-Eintrag in der /etc/fstab (wird KLEIN geschrieben (!) ;) ist ja nun schon viel richtiges geschrieben worden.

    Mal als Beispiel auf einem Linux, das unter systemd läuft (falls du das hast):

    Code
    //192.168.178.24/Home /mnt/ds916/ZenHome cifs uid=1000,gid=1000,x-systemd.automount,x-systemd.requires=network-online.target,credentials=/home/zen/.smbcredentials 0 0

    Dadurch wird da mounten verzögert, bis das netzwerk da ist.
    Weiterhin wird das Verzeichnis erst gemountet, wenn darauf zugegriffen wird. Der Mount wird weiterhin nach einer bestimmten Zeit der Nichtbenutzung getrennt (default time, weiss jetzt nicht aus dem Hut, wie lange..)

    das Zen

  • Wenn du eine Console aufmachst und mal testweise das folgende Kommando eingibst:

    Code
    systemd --test

    bekommst du entweder eine sinnvolle, vielzeilige Ausgabe (dann läuft systemd) oder nur eine Fehlermeldung, dass das Kommando nicht gefunden wurde.

    (Dieser Test ist nicht wirklich ein sicheres Zeichen, dass systemd auch wirksam ist, aber meist ausreichend...)

  • Ich habe mit deinem Code zum Mounten das Gefühl das es geht. Aber: wenn über Crontab ein Bild gemacht wird, erscheint am Desktop das Bild der Kamera und Schließt auch wieder. Problem ist nur, das es nicht auf dem Mount Laufwerk gespeichert wird. Wenn ich das ganze aber per Hand starte geschiet genau das gleiche, aber das Bild wird gespeichert...


    Gesendet von meinem ONEPLUS A3003 mit Tapatalk

  • Mein Python Skript, das mir ein Bild macht mit dem aktuellen Zeitstempel als Dateiname:


    Das Script von Hand starten funktioniert ohne Probleme.


    Rufe ich jetzt /media auf, und speichere dort die Python Datei für die Bildaufnahme, wird alles wie gewünscht in dem Ordner auf dem NAS gespeichert.

    Sobald ich aber alles automatisch machen lassen will, über Crontab, funktioniert dies nicht mehr.

    sudo crontab -e

    Code
    */1 * * * * sudo /usr/bin/python3 /media/kamera.py


    Der Crontab selbst funktioniert. Ich sehe wie die LED der Kamera angeht und anschließend wieder aus. Auch am Desktop sehe ich, wie das Bild erscheint und wieder schließt.

    Gesendet von meinem ONEPLUS A3003 mit Tapatalk

  • Die Fehlermeldung, die du erhälts, wäre ebenfalls interessant gewesen (sollte in /var/log/messages stehen), hatte ich vegessen zu schreiben.

    Egal: Kann es sein, dass das Python Script, wenn es aus der crontab aufgerufen wird, nicht weiss, wo es das Kommando "raspistill" hernehmen soll?

    Schreib doch da mal den vollen Pfad rein... den du mit

    Code
    which raspistill

    herausbekommst.

    Merke: Wenn Programme/Scripte aus der crontab heraus aufgerufen werden, laufen sie a) mit root Rechten und b) mit einem reduziertem Environment.
    D.h., z.B. in der PATH-Variablen des Environment sind nur rudimentäre Pfade zu den Programm-Verzeichnissen eingetragen.

    das Zen

  • Ich habe die Python Datei jetzt mit dem direkten Pfad angepasst.

    Code
    which raspistill


    ergab folgendes Ergebnis: /usr/bin/raspistill

    Diesen Pfad habe ich in die Python Datei eingetragen.
    Erneutes Ausführen des Scripts per Hand (sudo python3 kamera.py) ergab keine Fehlermeldung. Bild wird aufgenommen und gespeichert.

    Crontab werde ich die nächste Zeit feststellen, ob dieser mit dem Pfad funktioniert.

    Mein Log hat übrigens ganz oft folgenden Eintrag:
    Sep 29 09:49:01 raspberrypi rsyslogd-2007: action 'action 17' suspended, next retry is Thu Sep 29 09:50:31 2016 [try http://www.rsyslog.com/e/2007 ]

    Edit:
    Über Crontab funktioniert es leider nicht.
    Es werden keine Bilder auf meinem NAS (Mountpunkt) gespeichert.

    Die erneute Abfrage von

    Code
    sudo mount

    ergibt, dass das Mounten funktioniert hat.

    Ist es vielleicht möglich in Python festzulegen, wo ein Bild gespeichert werden soll?

    Dann lege ich das Script irgendwo lokal ab und der Speicherort soll in dem GeMounteten /media sein.

    Danke


  • Ist es vielleicht möglich in Python festzulegen, wo ein Bild gespeichert werden soll?
    Dann lege ich das Script irgendwo lokal ab und der Speicherort soll in dem GeMounteten /media sein.

    Code
    cmd = ('raspistill -o /media/' + zeit + '.jpg')

    Wenn du nichts zu sagen hast, sag einfach nichts.


  • Über Crontab funktioniert es leider nicht.
    Es werden keine Bilder auf meinem NAS (Mountpunkt) gespeichert.

    Die erneute Abfrage von

    Code
    sudo mount

    ergibt, dass das Mounten funktioniert hat.

    Ist es vielleicht möglich in Python festzulegen, wo ein Bild gespeichert werden soll?

    Ja, das dürfte das nächste problem sein: Der Speicherort.
    Da du bisher keinen angegeben hast, wird versucht, das Bild im "aktuellen" Verzeichnis zu speichern (at hoc hätte ich jetzt das root-Home Verzeichnis gedacht...) - dazu hat ja eben jemand etwas geschrieben... versuch das mal...

    ??Woran machst du eigendlich fest, dass der cron job fehlschlägt? Oder findest du das Bild nicht? Schau mal ins root-home-Verzeichnis ..

    BTW: Warum eigentlich das Python-Geraffel drumherum?
    Letztlich führst du ein ganz normales Kommando aus, die Zeitstempelberechnung kann man auf bash-Ebene ebenfalls machen...

    Insofern wäre ein kleines bash-Script einfacher zu handeln...

    das Zen

  • Als BASH-Script

    Bash
    #!/bin/bash                                                                                                                      
    DATEI='/media/'                                                                                                                  
    DATEI+=$(/usr/bin/date +'%Y-%m-%d_%H-%M-%S').jpg                                                                                 
    /usr/bin/raspistill -o $DATEI

    Wenn du nichts zu sagen hast, sag einfach nichts.

    Einmal editiert, zuletzt von llutz (29. September 2016 um 15:16)

  • So zunächst einmal DANKE für die zahlreichen Hilfen.

    Schau mal ins root-home-Verzeichnis ..

    BTW: Warum eigentlich das Python-Geraffel drumherum?

    Da ich von Bash absolut keine Ahnung habe, habe ich mir für Python entschieden.

    Und du hast recht! Die ganzen Bilder liegen im Root Verzeichnis! Danke für den Tipp!

    Code
    cmd = ('raspistill -o /media/' + zeit + '.jpg')

    Vielen Dank auch für diese Ergänzung! Genau jetzt wird alles wie ich es wollte auf /media (Mountpunkt) gespeichert!

    Vielen Dank für die Hilfen!

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!