[shell-script] Erweiterungen an Kopierscript

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Eomer
Beiträge: 63
Registriert: 27.04.2012 23:24:51

[shell-script] Erweiterungen an Kopierscript

Beitrag von Eomer » 24.04.2016 00:14:13

Hallo zusammen,

nachdem mir hier im Forum bereits so toll weitergeholfen wurde dachte ich mir direkt, dass man den Bogen noch weiter spannen könnte :P

Folgendes Script steht in Kombination mit einem Raspberry Pi 3 (raspbian) und einem 3.5"-TFT im Mittelpunkt:

Kurzform: Check ob was gemountet ist -> kopiere die dateien per rsync -> umount -> fertig.

Code: Alles auswählen

#!/bin/bash

# If the script detects the existence of both the source and destination disks
# then the contents ot the GOPRO folder is synchronised with files on the BACKUPDISK folder.
# Ensure that the Partition Label's on all your devices are set accordingly.

## Make sure the script isn't already running from a previous disk connection
################################################################################
if [ `ps -e | grep -c $(basename $0)` -gt 2 ]; then exit 0; fi
################################################################################

sleeptime=5
logfile=/opt/bin/syncjob.log
source=/media/backuo
destination=/media/cardreader
SourceCounter=20
DestinationCounter=20

############################################################
# Test if the Source disk is connected.
until [ $SourceCounter -lt 1 ]
do
   echo $SourceCounter >> $logfile
   if [ -d $source ]
   then
      echo "== Source Disk Found - Look for the Destination Disk ==" >>$logfile
      date >> $logfile
      let SourceCounter=0

      # Test if the Destination disk is connected.
      until [ $DestinationCounter -lt 1 ]
      do
         echo $DestinationCounter >> $logfile
         if [ -d $destination ]
         then
            echo "== Destination Disk Found - Backup Started ==" >> $logfile
            rsync -avzh $source $destination >> $logfile 2>&1
            echo "Backup Complete" >> $logfile
            echo "Unmount the  USB  disks" >> $logfile
            umount $source >> $logfile 2>&1
            umount $destination >> $logfile
            date >> $logfile
            echo "== Copy Complete ==" >> $logfile
            let DestinationCounter=0
         else
            echo "== Looking for the Destination Disk ==" >>$logfile
            sleep $sleeptime
         fi
         let DestinationCounter=DestinationCounter-1
      done

   else
      echo "== Looking for the Source Disk  ==" >>$logfile
      sleep $sleeptime
   fi
   let SourceCounter=SourceCounter-1
done

echo "Script Complete" >> $logfile
echo "===============" >> $logfile
Derzeit überlege ich noch, wie sich welche Sachen am besten umsetzen lassen würden.
Folgende Ideen habe ich derzeit und habe mir eine Liste zum "abhaken" gemacht.

1. Eine Prüfung, ob alle Dateien tatsächlich übertragen wurden.
- Wie kann man das am geschicktesten lösen?
- Wie kann man es so machen, dass sich der Pi bei einem Fehler bemerkbar macht (z,B, für eine Minute seine LED blinken lassen)

2. Umbenennen der Ordner mit Informationen aus den exif-Informationen (Datum, Kamera, Uhrzeit).
- Wie soll man das am besten Lösen?
- Bedarf es zusätzlicher Pakete die installiert werden sollten?

3. Informationen & Zwischenstände
- könnte man mit Notify-send machen, allerdings lässt sich die Anzeigedauer der Blasen nicht anpassen (-t ist wirkungslos...it's not a bug, it's a feature)
- gibt es gute Alternativen zu notify?


Ich freue mich auf Ideen und Vorschläge!

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: [shell-script] Erweiterungen an Kopierscript

Beitrag von eggy » 24.04.2016 01:20:21

Für exif-Daten gibts mehrere Ansätze, eins wäre z.B. exiftool aus libimage-exiftool-perl. Die anderen findest Du per "apt-cache search exif". Statt notify kannst Du Dir ja auch (lokal) ne Email schicken.

NAB
Beiträge: 5501
Registriert: 06.03.2011 16:02:23
Lizenz eigener Beiträge: MIT Lizenz

Re: [shell-script] Erweiterungen an Kopierscript

Beitrag von NAB » 24.04.2016 03:27:44

Eomer hat geschrieben:1. Eine Prüfung, ob alle Dateien tatsächlich übertragen wurden.
- Wie kann man das am geschicktesten lösen?
Wie? Ob sie tatsächlich übertragen wurden? Meinste, er lügt dich an? ;-)
Eomer hat geschrieben:- Wie kann man es so machen, dass sich der Pi bei einem Fehler bemerkbar macht (z,B, für eine Minute seine LED blinken lassen)
Vom Pi hab ich nun keine Ahnung ... kann er Geräusche machen? Hat er ne Soundkarte?

Und beim Thema Fehler fragt sich, welche du überhaupt abfangen willst. Dein Script meldet am Ende immer "Script Complete", egal ob es was kopiert hat oder nicht. Die zentrale Arbeit macht eh rsync ... guck mal hier:
https://wiki.ubuntuusers.de/rsync/
Eomer hat geschrieben:- gibt es gute Alternativen zu notify?
Ich hab nicht recht verstanden, was da angezeigt werden soll, aber guck mal hier:
https://wiki.ubuntuusers.de/Zenity/
Never change a broken system. It could be worse afterwards.

"No computer system can be absolutely secure." Intel Document Number: 336983-001

Eomer
Beiträge: 63
Registriert: 27.04.2012 23:24:51

Re: [shell-script] Erweiterungen an Kopierscript

Beitrag von Eomer » 24.04.2016 12:42:45

Hey,

danke Euch für die Antworten.

Zu eggy:

Ja, so war es vorher gelöst, aber es hat mir ehrlich gesagt nicht so gut gefallen. Weil man aktiv etwas tun muss (Mail "abrufen").


Zu NAB;

Nein ich glaube nicht, dass er mich anlügt, aber ich kriege es auch nicht mit, weil ich keine Konsole offen habe und auch nicht immer in den Logs gucken kann welche Dateien nun übertragen wurden und welche nicht.
Mein Arbeitskollege hat bemängelt, dass die "Sicherheitsmechanismen" fehlen würden. Die Formatierung einer Karte ist ja dann eine weitreichende Entscheidung und man will sicher sein, dass wirklich alle Daten erfolgreich übertragen wurden.

Nein, Geräusche macht er nicht. Er hat zwei kleine LED's.
Habe hierzu das hier gefunden:
http://pi-buch.info/?p=708


Also angezeigt werden soll z.B.

"Karte wurde erkannt"
"Kopiervorgang wurde gestartet"
"Kopiervorgang wurde beendet"
"Dateiprüfung beendet"

Ich werde an dem Pi halt nie eine Tastatur haben, also müssen es desktop-notifications sein.

Bei zenity sieht es so aus, als müsste man die Nachrichten aktiv bestätigen, richtig?


Viele Grüße

NAB
Beiträge: 5501
Registriert: 06.03.2011 16:02:23
Lizenz eigener Beiträge: MIT Lizenz

Re: [shell-script] Erweiterungen an Kopierscript

Beitrag von NAB » 24.04.2016 13:54:04

Eomer hat geschrieben:Nein ich glaube nicht, dass er mich anlügt, aber ich kriege es auch nicht mit,
"Ich glaube nicht, dass du mich anlügst, aber ich krieg es nicht mit, wenn du mich anlügst" ... logisch, wenn du mich nicht anlügst, kriege ich es auch nicht mit. Also was denn nun? ;-)
Eomer hat geschrieben:Die Formatierung einer Karte ist ja dann eine weitreichende Entscheidung und man will sicher sein, dass wirklich alle Daten erfolgreich übertragen wurden.
Eine "Formatierung" sehe ich in dem Script nirgends.
Eomer hat geschrieben:http://pi-buch.info/?p=708
Gut, die müsste sich dann ja mittels Shellscript fernsteuern lassen :)
Eomer hat geschrieben:Bei zenity sieht es so aus, als müsste man die Nachrichten aktiv bestätigen, richtig?
Also ich find nicht, dass das so aussieht in den Beispielen, die da angegeben werden ... aber ich hab's auch nicht getestet.

Und so prinzipiell ... verstehst du das Script denn? Du wirst nämlich nicht umhin kommen, es zu verstehen, wenn du es genau so umformen willst, wie du es gerne hättest. Die doppelte verschachtelte do-Schleife finde ich da eher unübersichtlich ... das könnte man meiner Meinung nach auch linear abarbeiten. Dann kannst du punktuell da eingreifen, wo du was angezeigt oder geprüft haben willst.

Und wie gesagt - die Hauptarbeit macht rsync, und das loggt nach $logfile. Ich würd einfach ein zweites Script hinterherjagen, das dieses Logfile auswertet ... oder es dem Benutzer vielleicht einfach anzeigt.
Never change a broken system. It could be worse afterwards.

"No computer system can be absolutely secure." Intel Document Number: 336983-001

Eomer
Beiträge: 63
Registriert: 27.04.2012 23:24:51

Re: [shell-script] Erweiterungen an Kopierscript

Beitrag von Eomer » 24.04.2016 14:29:25

Hey,

Ich verstehe das Script auf jeden Fall komplett. Es fällt mir nur unheimlich schwer etwas hinzuzufügen oder zu ändern. Ich 9/10 versuchen mache ich es falsch, allerdings habe ich mir diese Woche zum ersten mal ein Shell-Script im Detail angesehen.

Was das lügen angeht: ich würde halt gerne sicher gehen, dass alles kopiert wurde. Ich kriege derzeit ja keinerlei Feedback auf dem Desktop, dass alles geklappt hat. Die fertigmeldung als notification sollte an den Erfolg gebunden sein, nicht an das Ende des scripts.

Bzgl. des Formatierens: Nein, das mache ich danach von Hand und jedes mal von Hand zu prüfen ob wirklich alles übertragen wurde ist ja sehr umständlich, gerade ohne Tastatur und Maus.


Die notification schaue ich mir nochmal an.

Lg

NAB
Beiträge: 5501
Registriert: 06.03.2011 16:02:23
Lizenz eigener Beiträge: MIT Lizenz

Re: [shell-script] Erweiterungen an Kopierscript

Beitrag von NAB » 24.04.2016 15:18:22

Eomer hat geschrieben:Es fällt mir nur unheimlich schwer etwas hinzuzufügen oder zu ändern.
Das würde es mir bei dem Script auch. Wenn man da noch weitere ifs einbaut, verliert man ja endgültig den Überblick. Man könnte es auch linear abarbeiten ...
Existiert "Source Disk"? Nein? -> Warten. Existiert sie danach immer noch nicht? Nein? -> Fehlermeldung ins Log, Lämpchen rot leuchten lassen und exit.

Auf "Destination Disk" warten. Bei Fehler Source Disk unmounten (höm?), Fehlermeldung, Lämpchen und exit.

Und dann könnte rsync loslegen ... und danach werden beide Disks ge-umount-ed (höm?).

Und da ich die Vorgeschichte kenne, kommt mir das alles ziemlich sinnlos vor. Auf das Einstecken des Cardreaders reagierst du schon per Udev und lässt ihn im Script davor mounten. Dieses Script hingegen mounted gar nichts, will aber ein umount durchführen? Die einzige sinnvolle Zeile, die dieses Script enthält ist die mit dem rsync.
Eomer hat geschrieben:Was das lügen angeht: ich würde halt gerne sicher gehen, dass alles kopiert wurde. Ich kriege derzeit ja keinerlei Feedback auf dem Desktop, dass alles geklappt hat. Die fertigmeldung als notification sollte an den Erfolg gebunden sein, nicht an das Ende des scripts.
Nein, darum geht's beim Lügen nicht. Du kriegst sämtliche Meldungen ins Log gespeichert ... wann und wie man die anzeigt, ist ein völlig anderes Thema. Die Frage ist, wieweit du dem System vertraust. Wenn du anzweifelst, dass dein System Dateien korrekt kopieren kann, also Fehler im Dateisystem, Kernel oder Hardware bestehen (durchaus möglich), dann brauchst du eigentlich ein zweites Betriebssystem auf anderer Hardware, um das zu überprüfen. Dazu könntest du zu jeder Datei eine Prüfsumme berechnen lassen und die mit auf das Backup kopieren. Dann ließen sich Fehler nachträglich feststellen, mehr aber auch nicht, denn das Original hast du ja schon gelöscht (wenn ich dich recht verstehe), die Dateien wären also futsch.
Eomer hat geschrieben:Bzgl. des Formatierens: Nein, das mache ich danach von Hand und jedes mal von Hand zu prüfen ob wirklich alles übertragen wurde ist ja sehr umständlich, gerade ohne Tastatur und Maus.
Inzwischen reime ich mir das folgendermaßen zusammen: Kamera macht Bilder auf SD-Karte. Karte kommt aus der Kamera in den Pi und dort wird der Inhalt der Karte automatisch auf ... eh ... wohin? Naja, egal, irgendwo werden die Bilder hinkopiert. Danach löscht du die SD-Karte und sie kommt leer wieder in die Kamera. Richtig so?

In deinem Script ist der Cardreader das Ziel des Kopierens ... ich vermute, das ist in Wirklichkeit anders.
Never change a broken system. It could be worse afterwards.

"No computer system can be absolutely secure." Intel Document Number: 336983-001

TomL

Re: [shell-script] Erweiterungen an Kopierscript

Beitrag von TomL » 24.04.2016 15:53:16

Eomer hat geschrieben:Bzgl. des Formatierens: Nein, das mache ich danach von Hand und jedes mal von Hand zu prüfen ob wirklich alles übertragen wurde ist ja sehr umständlich, gerade ohne Tastatur und Maus.
Wenn vollständig alle Files der Quelle übertragen werden und das Ziel keine zusätzlich anderen Dateien enthält, ist das doch einfach: Einfach nen Verzeichnis-rekursiven Vergleich der Dateien von Quelle und Ziel.... nicht nach Inhalt, sondern nur ob vorhanden oder nicht und auf identisches Filedatum. Das hat gerade bei 6000 Files und knapp 2000 Verzeichnissen auf meinem PI knapp über 2 Minuten gedauert, um übers Netz zwei an einem anderen PI hängenden Platten auszuwerten und 2 definierte Verzeichnisse auf Unterschiede zu untersuchen. Vor dem Hintergrund dieser denkbar ungünstigen Konstellation sind 2 Minuten für 2 PI's übers Netz und 2 USB-Platten (USB und ETH teilen sich den gleichen Chip) schon ein ziemlich gutes Ergebnis.

Antworten