Трубные дампы ядра из скрипта

1199
Suedocode

Я делаю тестовый скрипт для компиляции (через make) и запускаю кучу тестов. У меня есть ряд cat, grepи sedкоманды, которые организует результаты всех тестов хорошо, однако ядро-отвалы являются исключением. Допустим, у меня есть программа под названием test. Если ./testдамп ядра, следующие строки не поймают его (так как он не будет передан в файл):

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

Это, вероятно, из-за этого сообщения об ошибке из скрипта:

./script.sh: строка 53: 4783 Прервано (ядро выгружено) ./test 2> & 1>> (журнал событий)

У меня есть хакерский обходной путь, который заставляет makeзапускать программу с пользовательским правилом:

сделать run-test 2> & 1 | чайник

В настоящее время это работает, но немного глупо использовать make-файл для этого. Есть ли другой способ захватить дамп ядра без прерывания строки сценария оболочки?

0

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

2
psusi

Это оболочка, которая печатает это сообщение, а не сбой программы. Чтобы получить выходные данные оболочки, вы также хотите:

{ ./test } > log 2 >&1 

Скобки приводят к запуску вспомогательной оболочки для выполнения команд внутри, и вывод всей вспомогательной оболочки перенаправляется вместо одной команды.

В качестве альтернативы, если вы хотите, чтобы весь вывод перенаправлялся на оставшуюся часть сценария, вы можете использовать:

exec > log 2>&1 
1
Scott

Если вы хотите запустить свою testпрограмму из другого скрипта, она должна быть достаточно хороша, чтобы захватить вывод этого скрипта. Т.е. вставьте « ./test» в testscript.sh, а затем скажите

./testscript.sh > log 2>&1 

Более компактное, но менее интуитивное решение

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

Оба решения основаны на том факте, что оболочка, запускающая программу, - это тот, кто замечает, когда программа выгружает ядро, и выдает соответствующее сообщение об ошибке. Поэтому, чтобы захватить это сообщение, вы должны захватить вывод из оболочки.

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