GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann ich alle Bash-Skriptaktionen vollständig protokollieren?

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:

  1. 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.

  2. 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.

  3. exec 1>log.out 2>&1

    stdout umleiten in Datei log.out dann stderr umleiten bis stdout . Beachten Sie, dass die Reihenfolge wichtig ist, wenn Sie möchten, dass sie in dieselbe Datei gehen. stdout muss vor stderr umgeleitet werden wird auf stdout 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.


Linux
  1. So echoen Sie eine neue Zeile in Bash-Shell-Skripten

  2. Wie kann man Bash-Skripte in Vim hervorheben?

  3. Wie kann ich schnell alle Zahlen in einer Datei summieren?

  4. Wie kann ich den TCP-Port 16969 in Bash beenden?

  5. Wie kann ich alle vhosts in nginx auflisten

So führen Sie alle Skripte in einem Verzeichnis unter Linux aus

So analysieren Sie CSV-Dateien in Bash-Skripten unter Linux

So erstellen Sie Dokumente mit Bash-Skripten

So verwenden Sie den Echo-Befehl in Bash-Skripten unter Linux

So arbeiten Sie mit Case-Anweisungen in Bash-Skripten

Wie kann ich alle gestoppten Jobs beenden?