使用“&”运行时,Linux 终端中缺少段错误输出

Cur*_*ind 5 linux terminal bash shell stderr

我正在调试一个必须与其他组件一起运行的应用程序。我将所有内容都包装在一个脚本中:

#!/bin/bash 
./component1 > 1.log & 
./my_application & 
./component2 > 2.log &
Run Code Online (Sandbox Code Playgroud)

我想在终端中看到输出,所以我没有重定向my_application.

原来my_application有段错误。但奇怪的是,抱怨分段错误信息的输出行没有在我的终端中打印出来。最后一行根本就不见了。

如果我./my_appliation单独在另一个终端中运行,则输出工作正常。我看到了“Segmentation fault”的最后一行

当我使用 & 运行我的应用程序时,为什么我的输出丢失?如果我在命令末尾添加 & 有什么区别?

eli*_*ias 1

消息“Segmentation failure”并不是真正从 shell 写入的,./my_applitation而是从 shell 写入的。

&当您在命令之后使用时,外壳程序将在子外壳程序的后台运行它,我认为该子外壳程序的 stderr 输出就是丢失的内容。

我在这里确认同样的事情:

$ 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 &"
$
Run Code Online (Sandbox Code Playgroud)

  • 在您的示例中,另一个考虑因素是,由于“segf”的父进程已退出,因此其父进程已变为“init”。在某些系统上,如果“init”获取了一个因信号而死亡的子进程,则它可能会“syslog”,但在大多数系统上不会;无论如何,它无法在启动死进程的终端上报告故障。这也是原始问题中缺少的部分:运行脚本的 shell 已退出,因此“my_application”的父级是“init”。 (2认同)