Fehlende Segfault-Ausgabe in Linux-Terminal, wenn "&" ausgeführt wird

1390
CodeNoob

Ich debugge eine Anwendung, die mit anderen Komponenten ausgeführt werden muss. Ich wickle alles in ein Skript ein:

#!/bin/bash  ./component1 > 1.log &  ./my_application &  ./component2 > 2.log & 

Ich möchte die Ausgabe im Terminal sehen, also habe ich die Ausgabe nicht weitergeleitet my_application.

Es stellte sich heraus, dass my_applicationes einen Segfault hatte. Das Seltsame ist jedoch, dass die Ausgabezeile, die sich über die Segmentierungsfehlerinformationen beschwert, nicht in meinem Terminal ausgedruckt wird. Diese letzte Zeile fehlt einfach.

Wenn ich ./my_appliationalleine in einem anderen Terminal bin, funktioniert die Ausgabe einwandfrei. Ich sehe die letzte Zeile "Segmentierungsfehler"

Warum fehlt meine Ausgabe, wenn ich meine Anwendung mit & starte? Welchen Unterschied macht es, wenn ich & am Ende des Befehls hinzufüge?

4

2 Antworten auf die Frage

1
elias

Die Meldung "Segmentierungsfehler" wird nicht wirklich von, ./my_applitationsondern von der Shell aus geschrieben.

Wenn Sie &nach einem Befehl die Shell ausführen, wird sie im Hintergrund in einer Subshell ausgeführt. Ich denke, die stderr-Ausgabe dieser Subshell geht verloren.

Ich bestätige das Gleiche hier:

$ cat >segf.c <<EOF int main(int argc, char *argv[]){ char *p; p=0; printf("%d", *p); } EOF $ make segf $ bash -c "./segf" Segmentation fault $ bash -c "./segf &" $ 
Eine weitere Überlegung in Ihrem Beispiel ist, dass der übergeordnete Prozess von 'segf' beendet wurde und sein übergeordneter Prozess zu 'init' wurde. Auf einigen Systemen kann "init" "syslog" sein, wenn es ein Kind erntet, das durch ein Signal gestorben ist, bei den meisten jedoch nicht. In jedem Fall hat es keine Möglichkeit, den Fehler auf dem Terminal zu melden, das den Dead-Prozess gestartet hat. Dies ist auch das fehlende Teil in der ursprünglichen Frage: Die Shell, die das Skript ausgeführt hat, wurde beendet, und das übergeordnete Element von my_application ist `init`. geekosaur vor 12 Jahren 2
0
citi7en

Der Grund ist möglicherweise, dass ./component1, ./my_application ./component2 gleichzeitig in Ihrem Skript ausgeführt wird. Wenn sie dieselben Dateien oder Geräte in Ihrem System verwenden, kann der Segfault angezeigt werden.