Reiniciando um executável baseado na saída do terminal

0

Backstory: Estou trabalhando com um software que usa o CMake para várias opções de construção. No meu sistema de compilação de área de trabalho quando executo um comando 'Processor Reset', o programa sai limpo, mas precisa ser reiniciado com um conjunto diferente de parâmetros. (A funcionalidade funciona corretamente no hardware, por isso não desejo modificar a fonte subjacente.)

Pergunta: A minha pergunta é, como posso monitorar a saída do terminal do programa e, ao ver "Processor Reset Received", acionar uma nova instância do programa?

Advertências

  • Minha resposta preferida seria realizada em um shell script, mas estou aberto a outras ideias.
  • Eu não desejo que haja alguma recursão.

Fluxo Geral

  • Inicie o programa com uma reinicialização na inicialização

    ./program -PO 
    

    (o programa é executado e imprime a saída no terminal)

  • Enviar um comando de redefinição do processador

  • O programa recebe o comando de reinicialização do processador, imprime informações relevantes e termina

  • O programa monitor lê que o programa original terminou com um Processor Reset e executa o programa novamente com diferentes flags.

    ./program -PR
    

Coisas que eu tentei

Eu tenho uma solução parcialmente funcional que ... é interessante. Parece que há algum buffer estranho acontecendo que eu tentei desativar, embora sem sucesso. Mas - ele com sucesso analisa a saída de terminal do programa e executa os flags de reset do processador quando necessário (embora uma vez, como não está em um loop).

stdbuf -o0 -i0 -e0 sudo ./program -PO | tee /dev/tty | (grep "Processor Reset.") | (read && sudo ./program -PR)

Para recapitular

  • Preciso que o código não armazene grandes blocos de dados (ou seja, escreva sem problemas porque produz resultados)
  • Deve ser envolvido em um loop para permitir várias redefinições do processador. (Qualquer outro reset deve terminar o loop.)
por Ramrod 05.07.2018 / 23:01

2 respostas

1

E se você tiver um script de shell assim:

$ cat top.bash
#!/bin/bash

echo "launched top.bash"
./fakeprog1.bash | grep -q "Processor Reset Received" && exec ./fakeprog2.bash

Você pode substituir o ./fakeprog1.bash pelo seu ./program -PO e ./fakeprog2.bash pelo seu ./program -PR .

Quando invoco minha versão, ela é executada assim:

$ ./top.bash
launched top.bash
launching /root/453742/fakeprog2.bash

O fakeprog1.bash ecoa uma mensagem, mas não podemos vê-la porque ela é filtrada pelo grep . Os registros podem ser direcionados para arquivos + este script via tee , portanto isso não deve ser um problema.

    
por 06.07.2018 / 06:40
0

Obrigado ao slm por me apontar na direção certa!

# Start the program with Power-On Reset
# Use tee to print output to terminal and pipe to grep
# grep returns 0 if the string is found
sudo ./program -PO | tee /dev/tty | grep -q "Processor Reset."

# Store the grep exit code in a variable
result="$?"

# If result is 0, grep found the Processor Reset string
if [ "$result" == "0" ]; then
  while : ; do
  sudo ./program -PR | tee /dev/tty | grep -q "Processor Reset."
  result="$?"

# This loop will continue as long as the Processor Reset string is found
# once the program terminates
  [ "$result" == "0" ] || break
  done
fi
    
por 06.07.2018 / 16:03