Hi, ich habe folgendes Problem: Bislang habe ich so gut wie nie Shell-Skripte geschrieben. Allerdings muss ich gerade ein wenig die Festplatte aufräumen. Da dachte ich mir, dass ich per WebDav Sachen auf einen externen Server hochlade. Allerdings wollte ich das Ganze aus Speicherplatzgründen seitens des Servers vorher per 7zip packen.
Am besten soll das Ganze gerne in Parts geschehen.(100MB-Parts)
Damit der Festplattenspeicher der lokalen Platte nicht ausgeht, sollen diese, wenn fertig(100MB) per rsync and das WebDav-Verzeichnis gesendet werden. Wenn ein Part fertig hochgeladen wurde, soll die lokale MD5-Summe mit der externen Summe verglichen und bei Gleichheit der lokale Part gelöscht werden.
Ich könnte die Parts theoretisch erst auf einer externen Festplatte auslagern, aber ich könnte das folgende Skript ggf. noch öfter brauchen und zudem hab ich da gerade bischen Arbeit reingesteckt und würde es gerne fertig bringen, dass es klappt. 😉
Was funktioniert bislang?: Das Packen via 7zip. Allerdings nicht mit LZMA2, nur mit LZMA, da bei LZMA2 ein Part scheinbar direkt 100MB aufweist, hingegen bei LZMA2 ein Part "wächst". Der Zugang via WebDav(getestet mit Owncloud und Box.com) Das Skript an sich, wenn von lokal nach lokal kopiert wird.
Das Problem welches nun besteht ist, dass rsync einen Part in 1-2 Sekunden "hochlädt"... Allerdings scheint der Part nur irgendwo gepuffert zu werden o.ä. Der Upload wird wohl in einem anderen Prozess(evtl. mount.davfs) fortgeführt?! Sogar die MD5-Summe stimmt sofort überein, wenn rsync glaubt er sei fertig.
Ist es möglich die Datei wirklich zunächst komplett hochzuladen und dann erst mit der nächsten Datei fortzufahren?
Hier erstmal das Skript, gerne auf Kritik, da es mehr oder weniger das erste Skript ist, welches ich selbst geschrieben habe und einen halbwegs sinnvollen Zweck erfüllt 😉 :
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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | #!/bin/bash ESTMFILESIZE=104857600 SRCFLD="/home/username/backup1/" DSTFLD="/mnt/webdav/backups/backup1/" UPLOADING=false while [ true ] do echo "Search for files" SRCFILES="" ALLFILES=`ls -fl $SRCFLD | awk -F' ' '{print $9}'` FILECOUNT=`echo $ALLFILES | awk -F' ' '{print NF}'` i=1 j=1 while ! [ $i -gt $FILECOUNT ] do TMPFILE=`echo $ALLFILES | awk -F' ' '{print $'"$i"'}'` if [ $TMPFILE != "." ] && [ $TMPFILE != ".." ]; then SRCFILES[$j]=$TMPFILE j=`expr $j + 1` fi i=`expr $i + 1` done FILESTOCOPY="" i=1 for CURRFILE in ${SRCFILES[*]} do echo $CURRFILE FILESIZE="`stat -c %s $SRCFLD$CURRFILE`" #echo $FILESIZE if [ $FILESIZE -eq $ESTMFILESIZE ]; then echo "to cpy: $CURRFILE with size: $FILESIZE" FILESTOCOPY[$i]=$CURRFILE i=`expr $i + 1` fi done echo "will cpy files" if [ $UPLOADING = false ]; then for CURRFILE in ${FILESTOCOPY[*]} do if [ $UPLOADING = false ]; then echo "copying: $CURRFILE" rsync --progress $SRCFLD$CURRFILE $DSTFLD$CURRFILE UPLOADING=true fi done else echo "cant upload, because 1 file is still uploading" fi echo "files copied" echo "check if deletion of files needed" DSTFILES="" ALLFILES=`ls -fl $DSTFLD | awk -F' ' '{print $9}'` FILECOUNT=`echo $ALLFILES | awk -F' ' '{print NF}'` i=1 j=1 echo "Search for remote files" while ! [ $i -gt $FILECOUNT ] do TMPFILE=`echo $ALLFILES | awk -F' ' '{print $'"$i"'}'` if [ $TMPFILE != "." ] && [ $TMPFILE != ".." ]; then DSTFILES[$j]=$TMPFILE j=`expr $j + 1` fi i=`expr $i + 1` done for CURRDSTFILE in ${DSTFILES[*]} do for CURRSRCFILE in ${SRCFILES[*]} do if [ -f $SRCFLD$CURRSRCFILE ] && [ $CURRDSTFILE = $CURRSRCFILE ]; then #echo "checking checksums of $CURRDSTFILE : " SRCMD5=`md5sum $SRCFLD$CURRSRCFILE | awk -F' ' '{print $1}'` DSTMD5=`md5sum $DSTFLD$CURRDSTFILE | awk -F' ' '{print $1}'` echo "dst: $DSTMD5 src: $SRCMD5" if [ $SRCMD5 = $DSTMD5 ]; then rm $SRCFLD$CURRSRCFILE echo "deleted $SRCFLD$CURRSRCFILE" UPLOADING=false fi fi done done echo "waiting for new files" unset SRCFILES unset ALLFILES unset FILECOUNT unset i unset j unset TMPFILE unset FILESTOCOPY unset FILESIZE unset DSTFILES unset SRCMD5 unset DSTMD5 sleep 5 done echo "finished" |
Danke schon einmal im Vorraus 😀
Edit: Scheinbar kann man den Cache unter /etc/davfs2/davfs2.conf anpassen, allerdings wahrscheinlich nicht deaktiveren. D.h man müsste das Skript dahingehend ändern, um zu prüfen ob noch Datei(en) im Cache liegen.