2016-11-03 3 views
1

Wenn ein Skript für ein anderes Skript für Rsync-Sicherungen verwenden, geben Sie Time Machine.Anormally beenden Formular Bash-Skript

Aber wenn Finish erste Anwenderprogramm stoppen

backup.sh

#!/bin/bash                                                                      
while read A; do 
    echo $A 
    ssh [email protected] "[[ -d /Volumes/MACBACKUP/desarrollo_backups/$A ]] || mkdir /Volumes/MACBACKUP/desarrollo_backups/$A; touch /Volumes/MACBACKUP/desarrollo_backups/$A/backup.marker" 
    bash /home/vagrant/rsync_tmbackup.sh $A/ [email protected]:/Volumes/MACBACKUP/desarrollo_backups/$A/ 
done < cuentas.txt 

Datei cuentas.txt

account1 
account2 
.. 
accountN 

Wenn er gestartet wird backup.sh

account1 # comment first iteration on while 
rsync_tmbackup: Previous backup found - doing incremental backup from [email protected]:/Volumes/MACBACKUP/desarrollo_backups/account1/2016-11-03-075246 
rsync_tmbackup: Creating destination [email protected]:/Volumes/MACBACKUP/desarrollo_backups/account1/2016-11-03-080415 
rsync_tmbackup: Starting backup... 
rsync_tmbackup: From: castris 
rsync_tmbackup: To: [email protected]:/Volumes/MACBACKUP/desarrollo_backups/account1/2016-11-03-080415 
rsync_tmbackup: Running command: 
rsync_tmbackup: rsync -e 'ssh -p 22 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null' -D --compress --numeric-ids --links --hard-links --one-file-system --itemize-changes --times --recursive --perms --owner --group --log-file '/home/vagrant/.rsync_tmbackup/2016-11-03-080416.log' --link-dest='/Volumes/MACBACKUP/desarrollo_backups/account1/2016-11-03-075246' -- 'castris/' '[email protected]:/Volumes/MACBACKUP/desarrollo_backups/account1/2016-11-03-080415/' | grep -E '^deleting|[^/]$' 
Warning: Permanently added '192.168.1.33' (ECDSA) to the list of known hosts. 
rsync_tmbackup: Backup completed without errors. # Here finish first iteration on while, and muts be with second iteration, but bash end while 

Und stoppen , Inste ad made backup für nächsten Benutzer account2

Antwort

1

könnten Sie "ssh -n" wie unten verwenden;

#!/bin/bash                                                                      
while read A; do 
echo $A 
ssh -n [email protected] "[[ -d /Volumes/MACBACKUP/desarrollo_backups/$A ]] || mkdir /Volumes/MACBACKUP/desarrollo_backups/$A; touch /Volumes/MACBACKUP/desarrollo_backups/$A/backup.marker" 
bash /home/vagrant/rsync_tmbackup.sh $A/ [email protected]:/Volumes/MACBACKUP/desarrollo_backups/$A/ 
done < cuentas.txt 

man ssh;

-n Leitet stdin von/dev/null um (verhindert das Lesen von stdin). Dies muss verwendet werden, wenn ssh im Hintergrund ausgeführt wird. Ein gängiger Trick ist es, mit diesem Programm X11-Programme auf einem Remote-Rechner auszuführen. Zum Beispiel, ssh -n shadows.cs.hut.fi emacs & startet eine Emacs auf shadows.cs.hut.fi, und die X11-Verbindung wird automatisch über einen verschlüsselten Kanal weitergeleitet werden. Das ssh-Programm wird in den Hintergrund gelegt. (Das funktioniert nicht, wenn ssh nach einem Passwort oder Passwort fragen muss, siehe auch die Option -f.)

+0

ssh -n nicht auflösen. Problem ist "nach" run Bash-Programm rsync_tmbackup.sh, nicht nach dem Ausführen von ssh Befehl. Vielen Dank. – abkrim

+0

@abkrim, Sie verwenden auch den Befehl ssh in rsync_tmbackup.sh. Könntest du das auch in deinem Skript ändern? rsync -e 'ssh -n -p ... –

+0

Warum? Ich mag es nicht, einen ssh-Befehl auszuführen. Meine Frage ist es anders. Frage es ist ein Fehler über Bash-Skript nach der ersten Iteration während while. ssh ist eine Programmzeile. bash ... es ist eine andere Zeile im Bash-Skript. – abkrim

0

Ich bin mir ziemlich sicher, dass @MustafaDOGRU rechts über das Grundproblem ist: wenn die Schleife beginnt, read liest die erste Zeile von cuentas.txt (wie erwartet), aber dann etwas in der Mitte der Schleife liest den Rest der Datei, so wenn das Skript versucht, read die nächste Zeile ... es gibt nichts mehr, und so ist es Zahlen es ist fertig und geht. Mustafas Ansatz bestand darin, herauszufinden, welcher Teil der Mitte der Schleife gelesen wurde, und es zu stoppen, aber es sieht so aus, als gäbe es mehrere Dinge, und es könnte nervig sein, sie aufzuspüren. Aber es ist eine andere Art und Weise: der Inhalt der Datei übergehen, etwas anderes als die Standardeingabe:

#!/bin/bash                                                                      
while read -u3 A; do 
    echo $A 
    ssh [email protected] "[[ -d /Volumes/MACBACKUP/desarrollo_backups/$A ]] || mkdir /Volumes/MACBACKUP/desarrollo_backups/$A; touch /Volumes/MACBACKUP/desarrollo_backups/$A/backup.marker" 
    bash /home/vagrant/rsync_tmbackup.sh $A/ [email protected]:/Volumes/MACBACKUP/desarrollo_backups/$A/ 
done 3< cuentas.txt 

Der 3< cuentas.txt cuentas.txt anweist Descriptor # 3 anstatt der Standardeingabe in eine Datei (die fd # 0) und die read -u3 liest von fd # 3, damit diese zusammen richtig funktionieren sollten. Da fd # 3 normalerweise unbenutzt ist, ist die Wahrscheinlichkeit, dass irgendetwas in der Mitte der Schleife damit rumhängt, ziemlich klein.

+0

Ok. Alles roght. Ich habe ein anderes Skript geschrieben. Dieser Script-Prozess läuft, aber nicht bash /home/vagrant/rsync_tmbackup.sh. Ergebnis? Führen Sie natürlich alle Iterationen ohne Probleme durch. Ich habe eine Menge von Skripten mit Schleifen, um mehrere Prozess-Remote-Maschinen laufen zu lassen, und das ist das erste Mal mit diesem Problem. http: //paste.tamainut.info/view/e6766181 Dieser Code, Remote-Befehl ausführen, Remote-Verzeichnisse erstellen, und nach – abkrim

+0

@abkrim Ich bin mir nicht sicher, ob ich Sie richtig verstehe, aber wenn einige Skripte funktionieren ohne den fd 3 Trick, ist es, weil nichts in der Schleife liest von Standardeingabe. Im Allgemeinen, während A lesen; do ... done

Verwandte Themen