Lösung 1:
Ich stelle im Allgemeinen etwas Ähnliches wie das Folgende an den Anfang jedes Skripts (insbesondere wenn es als Daemon ausgeführt wird):
#!/bin/bash
exec 3>&1 4>&2
trap 'exec 2>&4 1>&3' 0 1 2 3
exec 1>log.out 2>&1
# Everything below will go to the file 'log.out':
Erklärung:
-
exec 3>&1 4>&2
Speichert Dateideskriptoren, damit sie wiederhergestellt werden können, wie sie vor der Umleitung waren, oder sich selbst verwendet haben, um sie so auszugeben, wie sie vor der folgenden Umleitung waren.
-
trap 'exec 2>&4 1>&3' 0 1 2 3
Dateideskriptoren für bestimmte Signale wiederherstellen. Im Allgemeinen nicht erforderlich, da sie beim Beenden der Sub-Shell wiederhergestellt werden sollten.
-
exec 1>log.out 2>&1
stdout
umleiten in Dateilog.out
dannstderr
umleiten bisstdout
. Beachten Sie, dass die Reihenfolge wichtig ist, wenn Sie möchten, dass sie in dieselbe Datei gehen.stdout
muss vorstderr
umgeleitet werden wird aufstdout
umgeleitet .
Um von da an die Ausgabe auf der Konsole zu sehen (vielleicht), können Sie einfach zu &3
umleiten . Zum Beispiel
echo "$(date) : part 1 - start" >&3
wird wohin gehen stdout
wurde angewiesen, vermutlich die Konsole, bevor Zeile 3 oben ausgeführt wurde.
Lösung 2:
Um die ssh-Ausgabe in Ihre Logdatei zu bekommen, müssen Sie stderr
umleiten bis stdout
. Sie können dies tun, indem Sie 2>&1
anhängen nach Ihrem Bash-Skript.
es sollte so aussehen:
#!/bin/bash
(
...
) 2>&1 | tee ...
Wenn dies die Meldungen nicht in der richtigen Reihenfolge anzeigt, versuchen Sie, eine weitere Subshell hinzuzufügen:
#!/bin/bash
((
...
) 2>&1) | tee ...
Lösung 3:
Wie ich Ihre Frage gelesen habe, möchten Sie nicht die Ausgabe protokollieren, sondern die gesamte Befehlsfolge. In diesem Fall helfen Ihnen die anderen Antworten nicht weiter.
Rufen Sie Shell-Skripte mit -x auf, um alles auszugeben:
sh -x foo.sh
Melden Sie sich bei der gewünschten Datei an mit:
sh -x foo.sh >> /home/scripts/cron/logs
Lösung 4:
In Bash können Sie set -x
eingeben Danach druckt es jeden ausgeführten Befehl (und die Bash-Variablen) aus. Sie können es mit set +x
ausschalten .
Wenn Sie paranoid sein wollen, können Sie set -o errexit
eingeben in deinem Skript. Das bedeutet, dass das Skript fehlschlägt und stoppt, wenn ein Befehl einen Exit-Code ungleich Null zurückgibt, was die Unix-Standardmethode ist, um zu signalisieren, dass etwas schief gelaufen ist.
Wenn Sie schönere Protokolle erhalten möchten, sollten Sie sich ts
ansehen im moreutils
debian/ubuntu-Paket. Es wird jeder Zeile ein Zeitstempel vorangestellt und ausgedruckt. So können Sie sehen, wann etwas passiert ist.
Lösung 5:
In Anlehnung an das, was andere gesagt haben, ist das Set-Handbuch eine gute Ressource. Ich habe:
#!/usr/bin/env bash
exec 1> command.log 2>&1
set -x
An der Spitze der Skripte, die ich fortsetzen möchte, oder set -ex
wenn es bei einem Fehler beendet werden soll.