Despejos de núcleo de tubulação do script


0

Estou fazendo um script de teste para compilar (via make) e executar vários testes. I tem uma série de cat, grepe sedcomandos que organiza os resultados de todos os testes bem, no entanto core-lixeiras são a excepção. Digamos que eu tenha um programa chamado test. Se o ./testdump principal for despejado, as seguintes linhas não o capturam (como não serão canalizadas para o arquivo):

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

Provavelmente é por causa dessa mensagem de erro do script:

./script.sh: linha 53: 4783 Interrompida (core despejado) ./test 2> & 1>> (tee log)

Eu tenho uma solução hacky que faz o makelançamento do programa com uma regra personalizada:

faça o teste de execução 2> & 1 | tee -a log

Atualmente funciona, mas é um pouco hacky ter que usar o makefile para fazer isso. Existe outra maneira de capturar o core-dump sem interromper a linha de script do shell?

Respostas:


1

Se você deseja executar seu testprograma a partir de outro script, deve ser bom o suficiente para capturar a saída desse script. Ou seja, coloque " ./test" em testscript.she diga

./testscript.sh > log 2>&1

Uma solução mais compacta, mas menos intuitiva, é

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

Ambas as soluções são baseadas no fato de que o shell que executa um programa é o cara que percebe quando o programa despeja o núcleo e emite a mensagem de erro correspondente. Portanto, para capturar essa mensagem, você deve capturar a saída do shell.


2

É o shell que imprime essa mensagem em vez do programa que está travando. Para capturar a saída do shell também, você deseja:

{
./test
} > log 2 >&1

Os chavetas fazem com que um sub shell seja executado para executar os comandos internos, e a saída de todo o sub shell é redirecionada em vez de apenas um comando.

Como alternativa, se você deseja que toda a saída seja redirecionada para o restante do script, você pode usar:

exec > log 2>&1
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.