Tenho scripts que executam programas (que não fui autor) e alguns estão recebendo falhas de segurança em algumas entradas. Faço essas coisas em grandes lotes que duram até uma semana e gostaria de saber quais entradas estão desencadeando o problema. Do jeito que está, recebo uma notificação do Bash de que um determinado script meu sofreu uma falha de segurança. Mas o problema não está no script, está no programa de terceiros e em sua entrada. Se eu tivesse o nome da entrada, poderia trabalhar no problema.
A forma atual da chamada no meu script Bash é (por exemplo, programa 'autofix')
for indata in base*.fix; do
autofix $indata >${indata/.fix/.stdout} &
done
Como você pode ver, eles são iniciados em segundo plano e, no meu servidor robusto, pode haver cerca de 100 deles iniciados ao mesmo tempo, então não posso dizer qual deles falhou e não sou paciente o suficiente para tente todos os 100, um de cada vez, pois cada um pode levar uma hora. Capturar stderr não captura nada, então estou procurando outras ideias.
Encontrei uma solução em linha baseada apenas em brincar com coisas que eu já conhecia (ou pelo menos estava acostumado a encontrar) no Bash. Para testar e ilustrar, estou usando um pequeno programa em C que escrevi que apenas causa um SEGFAULT:
Então, depois de alguns testes (veja os comentários abaixo), acabei com este padrão simples no Bash (que poderia ser uma linha, mas estou apresentando uma forma mais legível):
Este não morre por causa do SEGFAULT, apenas percebe. Portanto, a saída é "isto morreu" e não "sucesso estranho" ou uma falha total do processo.
Esta abordagem mostra o código de erro que distingue entre SEGFAULT e outras formas de falha de processo, caso seja desejado.