
Eu tenho um aplicativo de linha de comando que envia muitas informações para o stdout.
Como posso encerrar o programa quando stdout contém uma determinada string?
por exemplo, algo como:
my_program | terminate_if_contains ERROR
A razão pela qual quero fazer isso é porque o programa foi escrito por terceiros e gera muitos ERROS para stdout, mas quero parar no primeiro erro, para não precisar esperar até que o programa termine.
Responder1
Tentar:
my_program | sed '/ERROR/q'
Isso imprime tudo, inclusive a primeira linha que contém ERROR
. Nesse ponto, sed
desiste. Logo depois disso, my_program
receberá um sinal de tubo quebrado (SIGPIPE) que faz com que a maioria dos programas pare.
Responder2
Aqui está minha solução rápida para esse problema:
Exemplos de uso:
$ watch_and_kill_if.sh ERROR my_program
watch_and_kill_if.sh
#!/usr/bin/env bash
function show_help()
{
IT=$(CAT <<EOF
usage: ERROR_STR YOUR_PROGRAM
e.g.
this will watch for the word ERROR coming from your long running program
ERROR my_long_running_program
EOF
)
echo "$IT"
exit
}
if [ "$1" == "help" ]
then
show_help
fi
if [ -z "$2" ]
then
show_help
fi
ERR=$1
shift;
$* |
while IFS= read -r line
do
echo $line
if [[ $line == *"$ERR"* ]]
then
exit;
fi
done
if [ "$1" == "help" ]
then
show_help
fi
if [ -z "$2" ]
then
show_help
fi
ERR=$1
shift;
$* |
while IFS= read -r line
do
echo $line
if [[ $line == *"$ERR"* ]]
then
exit;
fi
done