터미널 출력을 기반으로 실행 파일을 다시 시작합니다.

터미널 출력을 기반으로 실행 파일을 다시 시작합니다.

배경 이야기:저는 여러 빌드 옵션에 CMake를 사용하는 소프트웨어를 개발 중입니다. 데스크탑 빌드 시스템에서 "프로세서 재설정" 명령을 실행하면 프로그램이 완전히 종료되지만 다른 매개변수 세트를 사용하여 다시 시작해야 합니다. (이 기능은 하드웨어에서 잘 작동하므로 기본 소스 코드를 수정하고 싶지 않습니다.)

질문:내 질문은 "프로세서 재설정 수신됨"이 표시될 때 어떻게 프로그램의 터미널 출력을 모니터링하고 프로그램의 새 인스턴스를 트리거할 수 있느냐는 것입니다.

지침

  • 내가 선호하는 대답은 쉘 스크립트에서 이 작업을 수행하는 것이지만 다른 아이디어에도 열려 있습니다.
  • 나는 어떤 재귀도 원하지 않습니다.

일반과정

  • 전원 켜기 재설정을 통해 프로그램 시작

    ./program -PO 
    

    (프로그램이 실행되고 출력이 터미널에 인쇄됩니다.)

  • 프로세서 재설정 명령 보내기

  • 프로그램은 프로세서 재설정 명령을 수신하고 관련 정보를 인쇄한 후 종료됩니다.

  • 모니터 프로그램은 프로세서 재설정으로 인해 원래 프로그램이 종료되었음을 읽고 다른 플래그를 사용하여 프로그램을 다시 실행합니다.

    ./program -PR
    

내가 시도한 것들

부분적으로 작동하는 솔루션이 있습니다... 흥미롭습니다. 이상한 버퍼링이 진행되고 있는 것 같아서 비활성화하려고 시도했지만 성공하지 못했습니다. 그러나 프로그램의 터미널 출력을 성공적으로 구문 분석하고 필요한 경우 프로세서 재설정 플래그를 수행합니다(루프에 있지 않기 때문에 한 번만 수행됨).

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

검토

  • 큰 데이터 덩어리를 버퍼링하지 않는 코드가 필요합니다(예: 출력을 생성하는 동안 원활하게 쓰기).
  • 다중 프로세서 재설정을 허용하려면 루프에 포함되어야 합니다. (다른 재설정을 수행하면 루프가 종료됩니다.)

답변1

다음과 같은 쉘 스크립트가 있다면 어떨까요?

$ 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문제가 되지 않습니다.

답변2

올바른 방향을 알려주셔서 감사합니다!

# 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

관련 정보