# rsync

# rsync loop until finish

# Rsync automatisch wiederholen

Mit dieser Schleife wird ein fehlgeschlagener `<span class="editor-theme-code">rsync</span>`-Kopiervorgang nach 60 Sekunden erneut gestartet.

Die Schleife endet automatisch, sobald `<span class="editor-theme-code">rsync</span>` erfolgreich abgeschlossen wurde. Sie kann jederzeit mit `<span class="editor-theme-code">Strg + C</span>` abgebrochen werden.

## Rsync-Schleife

```bash
while true; do
    rsync -avP --append-verify -- \
        /mnt/Source/ \
        /mnt/Destination/

    status=$?

    if [ "$status" -eq 0 ]; then
        printf '%s: rsync wurde erfolgreich abgeschlossen.\n' \
            "$(date '+%F %T')"
        break
    fi

    printf '%s: rsync ist mit Exit-Code %s fehlgeschlagen. Neuer Versuch in 60 Sekunden.\n' \
        "$(date '+%F %T')" "$status"

    sleep 60
done
```

## Pfade anpassen

Der Quellpfad ist:

```bash
/mnt/Source/
```

Der Zielpfad ist:

```bash
/mnt/Destination/
```

Der abschließende Schrägstrich beim Quellpfad ist wichtig:

- `<span class="editor-theme-code">/mnt/Source/</span>` kopiert den Inhalt des Ordners.
- `<span class="editor-theme-code">/mnt/Source</span>` kopiert den Ordner `<span class="editor-theme-code">Source</span>` selbst.

## Erklärung der Schleife

### `<span class="editor-theme-code">while true; do</span>`

Startet eine Endlosschleife. Alle Befehle zwischen `<span class="editor-theme-code">do</span>` und `<span class="editor-theme-code">done</span>` werden wiederholt ausgeführt.

### `<span class="editor-theme-code">rsync -avP</span>`

Startet die Datenübertragung mit `<span class="editor-theme-code">rsync</span>`.

- `<span class="editor-theme-code">-a</span>` aktiviert den Archivmodus. Dabei werden unter anderem Berechtigungen, Zeitstempel und symbolische Links erhalten.
- `<span class="editor-theme-code">-v</span>` zeigt ausführlich an, welche Dateien verarbeitet werden.
- `<span class="editor-theme-code">-P</span>` zeigt den Fortschritt an und behält unvollständig übertragene Dateien.

### `<span class="editor-theme-code">--append-verify</span>`

Eine bereits teilweise übertragene Datei wird beim nächsten Versuch fortgesetzt. Anschließend überprüft `<span class="editor-theme-code">rsync</span>`, ob die zusammengesetzte Datei korrekt ist.

Diese Option eignet sich besonders für große Dateien, die sich während der Übertragung nicht verändern.

### `<span class="editor-theme-code">--</span>`

Das doppelte Minuszeichen beendet die Verarbeitung von Optionen. Dadurch werden Pfade, die mit einem Minuszeichen beginnen, nicht versehentlich als Befehlsoption interpretiert.

### `<span class="editor-theme-code">status=$?</span>`

Speichert den Exit-Code des zuletzt ausgeführten Befehls in der Variable `<span class="editor-theme-code">status</span>`.

- Exit-Code `<span class="editor-theme-code">0</span>` bedeutet: erfolgreich abgeschlossen.
- Ein anderer Exit-Code bedeutet: ein Fehler ist aufgetreten.

### `<span class="editor-theme-code">if [ "$status" -eq 0 ]; then</span>`

Prüft, ob `<span class="editor-theme-code">rsync</span>` erfolgreich abgeschlossen wurde.

### `<span class="editor-theme-code">printf</span>`

Gibt eine Meldung mit aktuellem Datum und aktueller Uhrzeit aus.

### `<span class="editor-theme-code">break</span>`

Beendet die Schleife, sobald `<span class="editor-theme-code">rsync</span>` erfolgreich war.

### `<span class="editor-theme-code">sleep 60</span>`

Wartet nach einem Fehler 60 Sekunden, bevor der nächste Versuch gestartet wird.

Für eine Wartezeit von fünf Minuten kann der Wert beispielsweise auf `<span class="editor-theme-code">300</span>` geändert werden:

```bash
sleep 300
```

### `<span class="editor-theme-code">done</span>`

Markiert das Ende der Schleife. Wenn `<span class="editor-theme-code">break</span>` nicht ausgeführt wurde, beginnt die Schleife anschließend erneut.

## Schleife abbrechen

Die laufende Schleife kann im Terminal mit folgender Tastenkombination beendet werden:

```
Strg + C
```

## Wichtiger Hinweis bei Ein-/Ausgabefehlern

Eine Meldung wie diese weist häufig auf ein Problem mit dem Datenträger, dem Dateisystem, einem Kabel, einem USB-Gehäuse oder einer Netzwerkverbindung hin:

```
Input/output error (5)
```

Die Schleife behebt die Ursache nicht. Sie startet lediglich die Übertragung erneut. Bei wiederholten Ein-/Ausgabefehlern sollten die Kernel-Meldungen geprüft werden:

```bash
journalctl -k -n 100 --no-pager
```

### `<span class="editor-theme-code">journalctl -k</span>`

Zeigt Meldungen des Linux-Kernels an. Dazu gehören unter anderem Fehler von Festplatten, USB-Geräten, Controllern und Dateisystemen.

### `<span class="editor-theme-code">-n 100</span>`

Begrenzt die Ausgabe auf die letzten 100 Meldungen.

### `<span class="editor-theme-code">--no-pager</span>`

Gibt die Meldungen direkt im Terminal aus, ohne ein zusätzliches Anzeigeprogramm zu öffnen.