배경 이야기:저는 여러 빌드 옵션에 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