4

Я отлаживаю приложение, которое должно работать с другими компонентами. Я оборачиваю все в сценарий:

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

Я хочу увидеть вывод в терминале, чтобы я не перенаправил вывод my_application .

Оказалось, что у my_application есть ошибка . Но странная вещь заключается в том, что строка вывода, которая жалуется на информацию об ошибке сегментации, не распечатывается в моем терминале. Эта самая последняя строка просто отсутствует.

Если я запускаю ./my_appliation один в другом терминале, то вывод работает нормально. Я вижу последнюю строку "Ошибка сегментации"

Почему мой вывод отсутствует при запуске приложения с &? Какая разница, если я добавлю & в конец команды?

2 ответа2

1

Сообщение "Ошибка сегментации" на самом деле написано не из ./my_applitation а из оболочки.

Когда вы используете & после команды, оболочка будет запускать ее в фоновом режиме в подоболочке, я думаю, что вывод 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 &"
$
0

Возможно, причина в том, что ./component1, ./my_application, ./component2 выполняется одновременно в вашем сценарии. Если они используют одинаковые файлы или устройства в вашей системе, может появиться ошибка.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .