Intereting Posts

Перезапуск исполняемого файла на основе вывода терминала

Предыстория: я работаю с программным обеспечением, которое использует CMake для нескольких вариантов сборки. В моей системе сборки рабочего стола, когда я выполняю команду «Сброс процессора», программа завершается корректно, но требует перезапуска с другим набором параметров. (Функциональность корректно работает на оборудовании, поэтому я не хочу изменять базовый источник.)

Вопрос: У меня вопрос, как я могу контролировать вывод терминала из программы и, увидев «Processor Reset Received», запустить новый экземпляр программы?

Предостережения

  • Мой предпочтительный ответ будет выполнять это в сценарии оболочки, но я открыт для других идей.
  • Я не хочу, чтобы была какая-либо recursion.

Общий stream

Вещи, которые я пробовал

У меня есть частично рабочее решение, которое … интересно. Похоже, что происходит странная буферизация, которую я пытался отключить, хотя и безуспешно. Но – он успешно анализирует выходные данные терминала программы и при необходимости выполняет флаги сброса процессора (хотя бы один раз, поскольку он не находится в цикле).

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

Подведем итоги

  • Мне нужен код, чтобы не буферизовать большие порции данных (т.е. писать гладко, поскольку он производит вывод)
  • Он должен быть заключен в цикл, чтобы можно было выполнить несколько сбросов процессора. (Любой другой сброс должен завершить цикл.)

    Что делать, если у вас есть такой скрипт:

     $ cat top.bash #!/bin/bash echo "launched top.bash" ./fakeprog1.bash | grep -q "Processor Reset Received" && exec ./fakeprog2.bash 

    Вы можете заменить ./fakeprog1.bash на ваши ./program -PO и ./fakeprog2.bash на ./program -PR .

    Когда я вызываю свою версию, она работает так:

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

    fakeprog1.bash сообщение, но мы его не видим, потому что оно отфильтровывается grep . Журналы могут быть направлены на файлы + этот скрипт через tee так что это не должно быть проблемой.

    Спасибо slm за то, что указал мне правильное направление!

     # 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