Queue für copy Script

D

DZane

Gast
Queue für copy Script (CentOS 3.5)

Hallo liebe Community,

ich habe folgende Frage an euch ...

Hier mal die Anforderung und die derzeitige Konfiguration

Anforderung:
1. Eine Datei wird in einen "Watchfolder" geschrieben.
2. Per incrond soll dann ein Script gestartet werden (nach Vollendung des Schreibvorgangs).
3. Es soll eine VPN Verbindung aufgebaut werden.
4. eine SAMBA Share soll gemounted werden.
5. Das/Die Files sollen dann auf das Share kopiert werden.
6. Nach dem Kopiervorgang soll das Share wieder geunmounted werden.
7. Der VPN Tunnel soll wieder geschlossen werden.

Die VPNC Verbindung soll nicht dauerhaft bestehen sondern nur auf bedarf aufgebaut und wieder abgebaut werden.


Derzeitige Konfiguration:
1. incrond checkt ob eine Datei in den "Watchfolder" geschrieben wurde.
2. incroned startet das VPNC-Script.
3. Script checkt ob VPNC bereits läuft (startet den Prozess gegebenenfalls).
4. Script prüft ob die Gegenseite erreichbar ist (PING).
5. Script prüft ob das Share bereist gemounted ist (mounted es gegebenenfalls).
6. Script kopiert das File auf das Share.
7. Script prüft die MD5 Summe beider Files (Source und Destination).
8. Script entfernt das Share.
9. Script beendet den VPNC Prozess.

Hier das derzeitige Script:
Code:
#!/bin/sh

#Erstellung der Logifle Variable
LOGFILE="/var/log/vpnc/filetransfer.log"

#Prüft ob VPNC läuft und startet den Dienst gegebenenfalls 
if ( ps -ef | grep -v grep | grep -v rtvpnc_ondemand | grep -v less | grep vpnc > /dev/null ) ; then
    echo -n `date` >> $LOGFILE
    echo "  [INFO] VPNC has already been started " >> $LOGFILE
else
    echo -n `date` >> $LOGFILE
    echo -n "  " >> $LOGFILE
    vpnc 2>&1 >> $LOGFILE
fi

#Überprüft per PING ob die Netapp auf seitens Moskau erreichbar ist
if ( ping -c 2 xx.xx.xx.xx > /dev/null 2>&1 ) ; then
    echo -n `date` >> $LOGFILE
    echo "  [INFO] Netapp reachable" >> $LOGFILE
else
    echo -n `date` >> $LOGFILE
    echo "  [ERROR] Netapp unreachable" >> $LOGFILE
    exit
fi

#Prüft ob das Share eingebunden ist
if ( mount | grep /mnt/smb > /dev/null ) ; then
    echo -n `date` >> $LOGFILE
    echo "  [INFO]Samba share already mounted" >> $LOGFILE
else
    x=$(mount -t cifs //xxxxxxx.xx/xxxxxxx/xxxxx /mnt/smb -o user=xxxx/xxxx,password=xxxx 2>&1)
    echo -n `date` >> $LOGFILE
    if [ -n "$x" ] ; then
        echo "  [ERROR] $x" >> $LOGFILE
    else
        echo "  [INFO] Samba share successfully mounted" >> $LOGFILE
    fi
fi

#Zieht sich die MD5 Summe der Datei aus Berlin
md5berlin=$(md5sum $1/$2 | grep -o -m 1 '^[0-9a-f]*')

#Zieht sich die Dateigröße
filesize=$(du $1/$2 | grep -o -m 1 '^[0-9]*')

#Beginn des Timestamps
start=$(date +%s)

#Kopiert die Datei nach Moskau
echo -n `date` >> $LOGFILE
echo -n "  " >> $LOGFILE
/bin/cp -rf "$1/$2" /mnt/smb/ 2>> $LOGFILE && echo "  [INFO] File sucessfully copied" >> $LOGFILE

#Ende des Timestamps
stop=$(date +%s)

#Berechnung der Übertragungszeit
time=$(expr $stop - $start)
min=$(expr $time / 60)
sec=$(expr $time % 60)

#asdasdasdqsa
echo -n `date` >> $LOGFILE
echo "  [INFO] The file '$2' with a size of $filesize KByte was copied in $min Min $sec s !" >> $LOGFILE

#Zieht sich die MD5 Summer der Datei aus Moskau
md5moscow=$(md5sum /mnt/smb/$2 | grep -o -m 1 '^[0-9a-f]*')

#Ãœberprüft die Dateigröße auf Unstimmigkeiten
echo -n `date` >> $LOGFILE
if [ "$md5berlin" = "$md5moscow" ] ; then
    echo "  [INFO] Filesize is matching" >> $LOGFILE
else
    echo "  [ERROR] Filesize is NOT matching - Berlin ($md5berlin) = Moscow ($md5moscow)" >> $LOGFILE
fi

#Das Share unmounten
if (mount | grep /mnt/smb > /dev/null) ; then
    y="$(umount /mnt/smb 2>&1)"
        echo -n `date` >> $LOGFILE
    if [ -n "$y" ] ; then
        echo "  [ERROR] $y" >> $LOGFILE
    else
        echo "  [INFO] Samba share successfully unmounted" >> $LOGFILE
    fi
fi

#VPNC stoppen
echo -n `date` >> $LOGFILE
echo -n "  " >> $LOGFILE
vpnc-disconnect 2>&1 >> $LOGFILE

exit


Das Script ist noch nicht wirklich optimiert und meine Frage bezieht sich wie im Titel beschrieben eher um das erstellen einer Queue für den Kopiervorgang.

Derzeit ist der Fall ja so, das jedes mal wenn ein File geschrieben wurde das Script gestartet wird und das File kopiert wird.
Mein Problem ist nun, das es auch mal vorkommen kann das mehrere Dateien zur gleichen/oder fast gleichen Zeit geschrieben werden und es daher zu Komplikationen kommen kann,
da sich eventuell gerade ein File im Kopiervorgang befindet und das vorangehende Script die Verbindung wieder kappt da dort der Vorgang beendet wurde.

derzeit habe ich folgende Idee um dies zu umgehen, nur weiß ich nicht ob es bessere Wege gibt dies zu umgehen.

Ich würde jetzt dem incrond sagen das er jedes File (den Namen der Datei) aus dem Watchfolder in eine extra *.txt (Queue.txt oder so) schreibt (Zeilenweise) und diese dann vom Script wieder ausgelesen wird.
Im Grunde soll also folgendes passieren:

1. File wird in den Watchfolder geschrieben.
2. Name der Datei wird in eine "queue.txt" geschrieben.
3. Das Script läuft los und liest bei jedem Durchgang die queue.txt von neuem ein um prüft ob sich in den Zeilen weiter namen befinden.
4. das Script kopiert die Datei auf das Share.
5. War der Kopiervorgang erfolgreich soll der Name der Datei aus der Queue.txt gelöscht werden.
6. Das script soll erneut prüfen ob sich noch weiter Dateien/Namen in der Queue.txt befinden und gegebenenfalls weiter kopieren.
7. Ist die Queue.txt leer, soll das Script beendet werden.



Ist das eine saubere und sinnvolle Lösung oder gibt es da bessere Methoden?


Für Vorschläge und konstruktive Kritik wäre ich dankbar.

Gruß

DZane


Edit:

Das Script läuft dann später auf CentOS 3.5 (falls das wichtig sein sollte).
 
Zuletzt bearbeitet von einem Moderator:

Ähnliche Themen

If-Abfrage kommt nicht positiv zurück, obwohl Kriterium erfüllt

NAS-Drive Mount in Bash-Script über crontab

Hilfe für ein shell script

script sshpass

Verschlüsseltes Backup-Script mit rsync

Oben