2016-09-12 3 views
0

Ich habe grundlegende. SH-Skript zur Erstellung von Nacht-Backups. Der gesamte Code ist:Logging/find Fehler in. SH-Skript

#!/bin/bash 

DATE=`date +%Y%m%d` 

tar czfP /var/www/backup/$DATE.tar.gz `find /var/www/web -type d | grep -E '/var/www/web/web[0-9]+/web' | grep -v 'web1'` 

Es macht mich $DATE.tar.gz Datei aller Bahnen auszuschließen "web1". Es funktioniert richtig, bis heute.

Wenn ich dieses Skript manuell in der Konsole ausführen (nicht mit Cron), sehe ich alle Warnungen ("No such file or directory", in der Regel, wenn dirname/Dateiname ein Leerzeichen im Namen hat). Es ist okay, ich kann damit nichts anfangen, Clients erstellen selbst Dateien. Diese Dateien haben kein Backup mehr, denke ich.

Heute endet der Skriptlauf jedoch in 1/3 mit der Fehlermeldung Exiting with failure status due to previous errors. Ich weiß nicht, wo das Skript fehlschlägt, also ...

Gibt es eine Möglichkeit, wie der "Pfad/Dateiname" der letzten Fehlerdatei (verursacht "Exiting with failure status due to previous errors") in das Protokoll schreiben? Wenn möglich, können wir "Keine solche Datei oder Verzeichnis" -Fehler ausschließen, sie werden täglich dort sein, ohne die Möglichkeit, Dateinamen zu reparieren.

Dank

PS:
ich diese Fehlermeldung gelesen habe kann durch ungültige Benutzerberechtigungen verursacht werden. Wenn ja, kann ich die Berechtigungen überprüfen, aber ich muss wissen, wo das Skript fehlschlägt. Bis jetzt funktionierte es wirklich richtig, vor etwa 3 Jahren wurden alle Dateien von CMS erstellt (derselbe WWW-Benutzer), nichts wird manuell hochgeladen.

Antwort

0

Die Ausgabe von find wird durch die Shell in Token umgewandelt, was bedeutet, dass jeder Dateiname mit Leerzeichen darin in Teile zerlegt wird (mehrere scheinbare Dateinamen, von denen wahrscheinlich keiner existiert). Grundsätzlich sollten Sie keine Backticks (oder allgemeiner command substitutions) verwenden, bei denen die Ausgabe eine Liste von Dateinamen ist.

Je nach Ihren Anforderungen kann die Problemumgehung sehr einfach sein.

tar czfP /var/www/backup/$DATE.tar.gz /var/www/web/www[02-9]/web 

wird web0 und web2 durch web9 archivieren. Wenn das alles ist, was Sie brauchen, sind Sie bereits fertig. Sie können ohne viel Verlust der Lesbarkeit auf Einzel- und Doppel Ziffern verlängern:

tar czfP /var/www/backup/$DATE.tar.gz /var/www/web/www[02-9]/web /var/www/web/www[02-9][0-9]/web 

usw. (und wenn Shell Bash ist, kann diese mit Klammern abgekürzt werden), sondern für mehrere Ziffern oder komplexere Verzeichnishierarchien, das ist vielleicht nicht was du wirklich willst.

Allgemeiner möchten Sie möglicherweise die --exclude Option von GNU tar erkunden.

Noch allgemeiner, wenn Sie GNU find haben, können Sie es Ausgabe produzieren, wo Pfadnamen durch Null-Bytes anstelle von Zeilenumbrüche getrennt sind. Dies macht die Ausgabe eindeutig (null ist das einzige Zeichen, das niemals in einem Dateinamen vorkommen kann) und robust.

find /var/www/web/www[0-9]/web -type d -path web1/web -prune -o -print0 | 
xargs -r0 tar czfP /var/www/backup/"$DATE".tar.gz 

Die -print0 Option und die entsprechende xargs -0 Option sind eine Erweiterung GNU. Ohne sie ist es nahezu unmöglich, beliebige Dateinamen robust zu handhaben, daher empfehle ich Ihnen, die GNU-Version zu installieren, wenn Sie auf einer Architektur stecken, die sie nicht standardmäßig bereitstellt.

Wie für die Erfassung der tar Fehler, würde ich vorschlagen, Sie Fehlerausgabe in eine Datei umleiten, so dass Sie es in Ihrer Freizeit überprüfen können.

+0

HI @Triple, thx für Ihre Antwort. "Um die tar-Fehler zu erfassen, würde ich vorschlagen, dass Sie die Fehlerausgabe in eine Datei umleiten, damit Sie sie in Ruhe lesen können." - Es ist wahrscheinlich, was ich suche, kannst du mir bitte sagen, wie? Ich habe 2> file.log gefunden, aber es funktioniert nicht für mich. Der Rest des Skripts ist nicht zufällig, ich verstehe es nicht und ich bin froh, dass es bis jetzt funktioniert hat :-) Ich denke, es ist besser, die Datei zu entfernen/zu reparieren, die das Ende des Skripts verursacht. – Roman

+0

Es ist kaputt, du musst es ändern. Es ist nicht klar, wie '2> file.log'" nicht funktioniert "; Kannst du es ausarbeiten? – tripleee

+0

Entschuldigung, ich weiß wirklich nicht, wie es funktioniert :-(, Ich bin Front-End-Entwickler. Ich fand zB. Https://www.cs.duke.edu/csl/docs/unix_course/intro-69. html (und andere, die einige sagen), versuchte ich 'tar czfP ... | grep -v 'web1' 2> file.log', um Fehler in vorhandenen Datei.log zu fangen. Das Skript nichts tun (ich habe nicht gesehen tar.gz Datei in meinem Server) Ich meine, es gibt kein Problem in der Regex oder alle auswählen und dann "web1" entfernen - es hat bis jetzt funktioniert, aber Ihre Lösung ist vielleicht besser. Jetzt muss ich welche Datei/Verzeichnis finden macht das Problem – Roman

Verwandte Themen