Ich möchte ALLE Protokolldaten mit Fehlermeldungen aus meiner Skriptausgabe erfassen und sie alle in die Protokolldatei umleiten.
Ich habe Skript wie folgt:
#!/bin/bash
(
echo " `date` : part 1 - start "
ssh -f admin@server.com 'bash /www/htdocs/server.com/scripts/part1.sh logout exit'
echo " `date` : sleep 120"
sleep 120
echo " `date` : part 2 - start"
ssh admin@server.com 'bash /www/htdocs/server.com/scripts/part2.sh logout exit'
echo " `date` : part 3 - start"
ssh admin@server.com 'bash /www/htdocs/server.com/scripts/part3.sh logout exit'
echo " `date` : END"
) | tee -a /home/scripts/cron/logs
Ich möchte alle Aktionen in einer Datei sehen /home/scripts/cron/logs
Aber ich sehe nur das, was ich nach dem Echobefehl setze.
Wie kann ich Protokolle einchecken, wenn der SSH-Befehl erfolgreich war?
Ich muss alle Protokolldaten erfassen. Ich brauche dies, um das Ergebnis jedes Befehls in meinem Skript zu überwachen und um besser analysieren zu können, was passiert, wenn ein Skript fehlschlägt.
Antworten:
Im Allgemeinen schreibe ich zu Beginn eines jeden Skripts etwas Ähnliches wie das Folgende (insbesondere, wenn es als Daemon ausgeführt wird):
Erläuterung:
exec 3>&1 4>&2
Speichert Dateideskriptoren, damit sie vor der Umleitung wiederhergestellt oder zur Ausgabe auf die Dateien verwendet werden können, die vor der folgenden Umleitung vorhanden waren.
trap 'exec 2>&4 1>&3' 0 1 2 3
Stellen Sie die Dateideskriptoren für bestimmte Signale wieder her. Im Allgemeinen nicht erforderlich, da sie beim Beenden der Sub-Shell wiederhergestellt werden sollten.
exec 1>log.out 2>&1
Weiterleiten
stdout
an Datei undlog.out
dann weiterleitenstderr
anstdout
. Beachten Sie, dass die Reihenfolge wichtig ist, wenn Sie möchten, dass sie in dieselbe Datei verschoben werden.stdout
muss umgeleitet werden, bevor zu umgeleitetstderr
wirdstdout
.Von da an können Sie einfach zu umleiten, um die Ausgabe auf der Konsole (möglicherweise) zu sehen
&3
. Zum Beispiel,wird dorthin gehen, wohin
stdout
es geleitet wurde, vermutlich zur Konsole, bevor Zeile 3 ausgeführt wurde.quelle
trap 'exec 2>&4 1>&3' 0 1 2 3 RETURN
. Die RETURN-Pseudo-Sigspec-Wiederherstellungsdatei-Deskriptoren jedes Mal, wenn eine Shell-Funktion oder ein Skript mit der ausgeführt wird. oder source builtins beendet die Ausführung. Aus diesem Grund (und aus anderen Gründen) füge ich in meinen Skripten die letzten beiden Zeilen hinzu:return
&exit 0
- Nur meine 2 Cent, ein dickes Lob an Sie @nicerobot!trap
Signale sieht etwas seltsam aus. Normalerweise möchten Sie auch einbeziehen15
.den SSH - Ausgang mit Ihrem Logfile zu erhalten, müssen Sie umleiten
stderr
zustdout
. Sie können dies tun, indem Sie2>&1
nach Ihrem Bash-Skript anhängen .es sollte so aussehen:
Wenn die Meldungen nicht in der richtigen Reihenfolge angezeigt werden, versuchen Sie, eine weitere Unterschale hinzuzufügen:
quelle
( ... ) |& tee output.log
Während ich Ihre Frage lese, möchten Sie nicht die Ausgabe protokollieren, sondern die gesamte Befehlsfolge. In diesem Fall helfen Ihnen die anderen Antworten nicht.
Rufen Sie mit -x Shell-Skripte auf, um alles auszugeben:
sh -x foo.sh
Loggen Sie sich in die gewünschte Datei ein mit:
sh -x foo.sh >> /home/scripts/cron/logs
quelle
In bash können Sie put
set -x
und es wird jedes Kommando, das es ausführt (und die bash Variablen), danach ausgedruckt. Sie können es mit ausschaltenset +x
.Wenn Sie paranoid sein möchten, können Sie
set -o errexit
Ihr Skript einfügen. Dies bedeutet, dass das Skript fehlschlägt und stoppt, wenn ein Befehl einen Exit-Code ungleich Null zurückgibt. Dies ist der Unix-Standard, der signalisiert, dass ein Fehler aufgetreten ist.Wenn Sie schönere Protokolle erhalten möchten, sollten Sie sich
ts
dasmoreutils
debian / ubuntu-Paket ansehen . Jeder Zeile wird ein Zeitstempel vorangestellt und ausgedruckt. So können Sie sehen, wann die Dinge geschahen.quelle
Nach dem, was andere gesagt haben, ist das Set- Handbuch eine gute Ressource. Ich legte:
Ganz oben in den Skripten möchte ich weitermachen oder
set -ex
ob es bei einem Fehler beendet wird.quelle
ssh -vv
?