Wie kann ich in Unix ein Skript mit folgenden Anforderungen erstellen? [geschlossen]

-2

Ein Skript mit dem Namen /root/backup.shw01, das den Inhalt von / home sichert

Das Skript wird:

  • Erstellen Sie ein tar-Archiv mit dem Namen /share/<YYYY><MM><DD>_w01.tarwhere
    • JJJJ repräsentiert das aktuelle Jahr (dh 2014)
    • MM repräsentiert den aktuellen Monat (dh 11)
    • DD steht für den aktuellen Tag des Monats (dh 22)
  • Log Erfolg und Fehler an /tmp/backup.log
  • Beenden Sie mit einem Rückkehrcode ungleich Null, wenn ein Fehler auftritt
Dhrumit Patel
quelle
2
Willkommen in SU! Wir sind kein Skriptschreibdienst. Wir können und werden Ihnen jedoch bei bestimmten Problemen bei der Skripterstellung helfen. Dazu müssen wir jedoch wissen, was Sie bisher haben und wo Sie bei der Implementierung des Skripts stecken bleiben.
ƬᴇcƬᴇιᴇ007
Dank dafür. Eigentlich geht es darum, dass es mir schwer fällt, zu verstehen, wonach es eigentlich verlangt. Aus diesem Grund habe ich hier darum gebeten, mir ein Skript zu schreiben, damit ich andere Skripte selbst verstehen und schreiben kann. # ƬᴇcƬᴇιᴇ007
Dhrumit Patel
"Es fällt mir schwer zu verstehen, wonach es eigentlich verlangt." Ich habe das gleiche Problem mit Ihrer Frage. :) Was ist "Es" in diesem Satz? Um zu lernen, wie man Skripte schreibt, gibt es Unmengen von Ressourcen online, wie zum Beispiel diese und diese .
ƬᴇcƬᴇιᴇ007
Ja, ich weiß ... Aber ich spreche über dieses spezielle Drehbuch. Das Skript sichert den Inhalt von \ home auf der Workstation. Können Sie mir einen Vorsprung geben, wenn möglich?
Dhrumit Patel

Antworten:

4

Die wichtigsten Faktoren, die Sie zum Zusammenstellen des Skripts benötigen, sind die folgenden: (Ich empfehle Ihnen, jedes Skript als separates Stück Code zu schreiben, zu testen und alles zusammenzustellen, sobald Sie zufrieden sind.)

  • Dateinamen (dh unter Verwendung des aktuellen Datums in Ihrem Tarballnamen):
    Wie in einer anderen Antwort angegeben, man dategibt Ihnen diese Hilfe, konzentrieren Sie sich auf den Formatabschnitt (z. B. date +%Y%m...).

  • Protokollierung (dh Speichern der Ausgabe des TAR in einer Datei, auf die Sie später verweisen können):
    Zunächst müssen Sie entscheiden, wie lange das Protokoll gespeichert werden soll, ob Sie die Versuche des Vortages dort ausführen möchten oder nur die neuesten ? Wenn Sie mehrere Tage sparen, möchten Sie am Anfang jedes neuen Laufs einen Datenstempel einfügen, damit Sie sehen können, wo einer endet und der nächste beginnt.

    • echo "here's a command" > /tmp/backup.log überschreibt den Inhalt von /tmp/backup.log und setzt den String "here's a command" an seine Stelle.
    • echo "here's a command" >> /tmp/backup.log behält alle vorhandenen Daten in /tmp/backup.log bei und hängt "hier ist ein Befehl" an das Ende an.
    • tar -cvf /share/foo.tar /home > /tmp/backup.log Es wird nur STDOUT (dh die übliche Ausgabe von "Ich habe diese Dateien als Ziel ausgewählt") in das Protokoll aufgenommen, Fehler werden jedoch nicht erfasst.
    • tar -cvf /share/foo.tar /home 2> /tmp/backup.log wird nur STDERR (dh nur die Fehler) in das Protokoll setzen.
    • tar -cvf /share/foo.tar /home > /tmp/backup.log 2>&1 Fügt sowohl STDOUT als auch STDERR in das Protokoll ein.

    Kombinieren Sie diese, um genau den richtigen Datensatz in Ihrem Protokoll zu erstellen.

  • Fehlerbehandlung (dh was ist, wenn Teer zu tun , einen Fehler zurückgibt:
    Eine schnelle und schmutzige Art und Weise , um Fehler in einem Befehl zu reagieren , wird nur hinzufügen || command_to_run_if_error. Nach dem Befehl Dies sagt im Wesentlichen „ um diesen Befehl ausführen , bis es gelingt“, können Sie auch Verwenden Sie && command_to_run_if_successdies als würde man sagen "Führe diese Befehle der Reihe nach aus, bis einer ausfällt".

    • command1 || command2 Führt Befehl1 aus und wenn dies fehlschlägt (Exit-Code ungleich Null), wird Befehl2 ausgeführt. Wenn dies erfolgreich ist, wird command2 nicht ausgeführt.
    • command1 && command2 Führt command1 aus und wenn dies fehlschlägt, wird command2 angehalten und nicht ausgeführt. Wenn command1 erfolgreich ist, wird nur command2 ausgeführt.
    • Ein vollständigerer Fehlerbehandler kann mit erstellt werden if .. then .. else .. fi

    z.B
    echo "About to run command1" >> logfile.log
    if command1 >> logfile.log
    then
    echo "All went well" >> logfile.log
    else
    echo "Something went wrong! ABORTING" >> logfile.log
    run_some_cleanup_command
    exit 1
    fi

    Kombinieren Sie diese, um Ihrem Skript beizubringen, was für jeden Fehlerfall zu tun ist.

Einige andere Dinge zu beachten:

  • Möchten Sie überprüfen, ob Platz für Ihren Tarball vorhanden ist, bevor Sie ihn erstellen?
    Überlegen Sie du -sk /home, wie viele KB gesichert werden müssen, und vergleichen Sie dies mit der Menge an freiem Speicherplatz in df -k /share. Sie können Shell-Befehle verwenden, [ $space_on_share -lt $data_in_home ] || exit 1um den Vorgang abzubrechen, anstatt den gesamten freien Speicherplatz zu belegen.

  • Möchten Sie alles in / zu Hause sichern?
    Erwägen Sie, eine Liste von Dingen zu haben, die ausgeschlossen werden sollten, um Platz zu sparen oder die Privatsphäre zu schützen.

  • Haben Sie darüber nachgedacht, Komprimierung zu verwenden, um Platz zu sparen?
    Einige Versionen von tar akzeptieren das -z Flag, um die gzip-Komprimierung zu verwenden, oder Sie können STDOUT als Dateinamen angeben und dann die Ausgabe durch gzip ( tar -cf - /home | gzip -c > /share/foo.tar.gz) leiten.

Lächelnder Drache
quelle
2

Der Schlüssel zum Starten eines Skriptproblems besteht darin, es in kleine Teile zu zerlegen. Codieren und testen Sie die ersten kleinen Teile, bevor Sie weitere Funktionen hinzufügen.

Zum Beispiel

Schritt 1

Sie könnten damit beginnen, ein Skript zu schreiben, das "Starting backup" ausgibt und sonst nichts tut.

Schritt 2

Wenn dies funktioniert, ändern Sie es, um die Ausgabe des dateBefehls einer Shell-Variablen zuzuweisen (z. B. $today) und den Inhalt dieser Variablen zu drucken.

Schritt 3

Wenn Schritt 2 vollständig getestet wurde und funktioniert, man datesehen Sie sich an, wie Sie die Ausgabe ändern, um das gewünschte Ausgabeformat "<JJJJ> <MM> <TT>" zu erhalten.

und so weiter. Wenn Sie zu irgendeinem Zeitpunkt nicht weiterkommen, durchsuchen Sie SuperUser (usw.) nach dieser speziellen kleinen, gut fokussierten Frage, um festzustellen, ob eine Antwort vorhanden ist. Wenn nicht, schreiben Sie eine sorgfältig komponierte, eng fokussierte Frage, die zeigt, was Sie getan haben, was es getan hat und was Sie stattdessen von ihm wollten. Zeigen Sie den ausführbaren Code an, aber entfernen Sie alles Fremdmaterial.

RedGrittyBrick
quelle