Отсутствует вывод segfault в терминале Linux при запуске с "&"

1331
CodeNoob

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

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

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

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

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

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

4

2 ответа на вопрос

1
elias

Сообщение "Ошибка сегментации" на самом деле не написано, ./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 &" $ 
Дополнительное соображение в вашем примере заключается в том, что, поскольку родительский процесс `segf` завершился, его родительский процесс стал` init`. В некоторых системах `init` может` syslog`, если он пожинает ребенка, который умер по сигналу, но в большинстве это не так; в любом случае он не может сообщить о сбое на терминале, который запустил неработающий процесс. Эта часть также отсутствует в исходном вопросе: оболочка, запустившая скрипт, завершилась, поэтому родителем my_application является `init`. geekosaur 12 лет назад 2
0
citi7en

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

Похожие вопросы