Pipe-Core-Dumps aus Skript

1266
Suedocode

Ich mache ein Testskript zum Kompilieren (via make) und Ausführen einer Reihe von Tests. Ich habe eine Reihe von cat, grepund sedBefehle, die gut die Ergebnisse aller Tests organisiert, aber Kern-Dumps sind die Ausnahme. Nehmen wir an, ich habe ein Programm aufgerufen test. Wenn ./testCore-Dumps erstellt werden, werden die folgenden Zeilen nicht abgefangen (da sie nicht in die Datei geleitet werden):

./test 2>&1 > >(tee log) ./test > log 2>&1 

Es liegt wahrscheinlich an dieser Fehlermeldung aus dem Skript:

./script.sh: Zeile 53: 4783 Abgebrochen (Kernspeicherauszug) ./test 2> & 1>> (Abschlagprotokoll)

Ich habe eine harte Workaround, die makedas Programm mit einer benutzerdefinierten Regel startet:

Lauftest durchführen 2> & 1 | Abschlag -ein Protokoll

Das funktioniert derzeit, aber es ist ein bisschen hässlich, das Makefile dafür verwenden zu müssen. Gibt es eine andere Möglichkeit, den Core-Dump zu erfassen, ohne die Shell-Skriptlinie abzubrechen?

0

2 Antworten auf die Frage

2
psusi

Die Shell druckt diese Nachricht und nicht das abstürzende Programm. Um auch die Ausgabe der Shell zu erfassen, möchten Sie:

{ ./test } > log 2 >&1 

Die geschweiften Klammern bewirken, dass eine Sub-Shell ausgeführt wird, um die darin enthaltenen Befehle auszuführen, und die Ausgabe der gesamten Sub-Shell wird anstelle eines einzigen Befehls umgeleitet.

Wenn Sie die gesamte Ausgabe für den Rest des Skripts umleiten möchten, können Sie alternativ Folgendes verwenden:

exec > log 2>&1 
1
Scott

Wenn Sie bereit sind, Ihr testProgramm von einem anderen Skript aus auszuführen, sollte es die Ausgabe dieses Skripts erfassen. Also, setzen Sie " ./test" in testscript.shund sagen Sie dann

./testscript.sh > log 2>&1 

Eine kompaktere, aber weniger intuitive Lösung ist

sh -c "./test" > log 2>&1 

Beide Lösungen basieren auf der Tatsache, dass die Shell, die ein Programm ausführt, der Kerl ist, der bemerkt, wenn das Programm den Kernspeicher entlädt, und die entsprechende Fehlermeldung ausgibt. Um diese Nachricht zu erfassen, müssen Sie daher die Ausgabe von der Shell erfassen.