staging.inyokaproject.org

wie kann ich Error-Code und Ausgabe umleiten?

Status: Gelöst | Ubuntu-Version: Ubuntu 21.04 (Hirsute Hippo)
Antworten |

Serengeti

Avatar von Serengeti

Anmeldungsdatum:
24. Februar 2008

Beiträge: 1966

Hallo zusammen Ich bastle gerade etwas mit der bash und möchte nun gerne folgendes machen: Ich führe verschiedene Anwendungen in einem Bash script aus (rsync, mv, gs, etc.) Von jeder Anwendung möchte ich den Error-Code und die Ausgabe umleiten.

Die Ausgabe leite ich zur Zeit mit | systemd-cat -t Ausgabe-meines-Scriptes ins journal. Um aber sicher zu sein, dass der Befehl sauber funktioniert hat, möchte ich zusätzlich nachfolgende Befehle anhand des Error-Codes $? ausführen, kann ich aber nach dem weiterleiten der Ausgabe an Systemd nicht mehr von der ursprünglichen Anwendung auslesen und umgekehrt.

Hat jemand eine Idee wie ich das machen kann?

Seebär

Avatar von Seebär

Anmeldungsdatum:
2. Mai 2009

Beiträge: 833

Einen exitcode leitet man nicht um, was hier gesucht ist ist der Exitcode in einer pipeline.

set -o pipefail

kann man nutzen.

DJKUhpisse Team-Icon

Supporter, Wikiteam
Avatar von DJKUhpisse

Anmeldungsdatum:
18. Oktober 2016

Beiträge: 18245

echo $? > /tmp/test

Das muss dann direkt nach dem Befehl kommen, da man immer den Exit-Code des vorhergehenden Befehls erhält.

Seebär

Avatar von Seebär

Anmeldungsdatum:
2. Mai 2009

Beiträge: 833

Unsinn. Und warum sollte man in eine Datei schreiben? Um was dann zu tun?

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Du kannst die Befehle auch gruppieren und die Ausgabe der Befehlsgruppe ins Log schreiben lassen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
{
  do_something || fehlerbehandlung
} | systemd-cat -t Ausgabe-meines-Scriptes
# bzw. wenn man auf den Exit-Code differenzierter reagieren will:
{
  do_something
  ec=$?
  case ec in
    0)
      echo alles ok
      ;;
    2)
      spezielle_fehlerbehandlung
      ;;
    *)
      allgemeine_fehlerbehandlung
      ;;
  esac
} | systemd-cat -t Ausgabe-meines-Scriptes

Wenn die Skripte ohnehin von Systemd-Units ausgeführt werden, reicht es die entsprechend zu konfigurieren, dass stdout und stderr im Syslog landen: https://www.freedesktop.org/software/systemd/man/systemd.exec.html#StandardOutput=

Serengeti

(Themenstarter)
Avatar von Serengeti

Anmeldungsdatum:
24. Februar 2008

Beiträge: 1966

Tolle Idee @seahawk1986 das kann ich auch gut brauchen.

Danke!

@Seebär Ich möchte nicht das ganze script abschiessen. Finde es aber auch ein Interessantes werkzeug, dass ich bislang nich nicht kannte.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Du kannst auch oben im Skript set -e einfügen. Dann bricht die Shell das Skript bei jedem Fehler ab, der nicht in einem Kontrollfluss-Statement (if, while usw.) auftaucht.

Dakuan

Avatar von Dakuan

Anmeldungsdatum:
2. November 2004

Beiträge: 6532

Brauchst Du den Rückgabewert wirklich, oder ist das nur Neugierde?

Die Bash scheint da bei den Rückgabewerten ziemlich zu tricksen. Denn außer dem eigentlichen Rückgabewert des aufgerufenen Programms liefert das System noch weitere Informationen, die zur Beendigung des Programms geführt haben könnten.

Der eigentliche Exit-Status vom System ist in den Bits 8 bis 15 kodiert und nur gültig wenn die Bits 0 bis 7 Null sind. Die Bash biegt das wohl teilweise wieder zurück und bietet spezielle Rückgabewerte bei Abbruch durch Signale etc. Ich finde das recht undurchsichtig.

Was ich damit sagen will ist, Du solltest schon eine Idee haben wonach du suchst. Niedrige positive und negative Werte (einstellig, gerne -1) scheinen aber immer zu funktionieren.

Serengeti

(Themenstarter)
Avatar von Serengeti

Anmeldungsdatum:
24. Februar 2008

Beiträge: 1966

Mittlerweile leite ich meine Scripte so ein

1
2
3
4
5
6
7
#!/bin/bash

scriptname=$(basename $0)
exec 11> >(systemd-cat -t $scriptname -p 5)
exec 22> >(systemd-cat -t $scriptname -p 3)
exec 1> >(tee /dev/fd/11 )
exec 2> >(tee /dev/fd/22 1>&2)

Damit werden automatisch alle ausgaben ihrer priorität entsprechend nach journald ausgegeben. Und ich kann sie da bei bedarf auslesen.

Antworten |