Bash - 출력을 읽는 동안 백그라운드 프로세스 실행

Bash - 출력을 읽는 동안 백그라운드 프로세스 실행

프로세스( target_executable)를 시작하고 백그라운드에서 실행하려고 합니다. 다음과 같은 방법으로 할 수 있다는 것을 알고 있지만 ./target_executable &쇼를 실행하는 bash 스크립트 내에서 프로세스의 출력을 읽고 특정 출력을 찾고 싶습니다. 그런 다음 출력이 .found이면 대상 프로세스가 백그라운드에서 실행되는 동안 스크립트가 완료되기를 원합니다.

지금까지 해본 내용은 이렇지만 문제가 많습니다(백그라운드에서 프로세스를 실행하지 않고 ID를 찾아도 "읽기 완료"에 도달하지 않습니다).

echo "Starting Process..."
TARGET_ID=""
./target_executable | while read -r line || [[ "$TARGET_ID" == "" ]] ; do
    TARGET_ID=$(echo "$line" | grep -oE 'Id = [0-9A-Z]+' | grep -oE '[0-9A-Z]{10,}')

    if [ "$TARGET_ID" != "" ]
    then
        echo "Processing $line '$TARGET_ID'"
    fi
done
echo "Finished Reading..."

어떤 아이디어가 있나요?

답변1

이것은 직업인 것 같습니다 coproc. 도움말에서:

coproc: coproc [NAME] command [redirections]
    Create a coprocess named NAME.

    Execute COMMAND asynchronously, with the standard output and standard
    input of the command connected via a pipe to file descriptors assigned
    to indices 0 and 1 of an array variable NAME in the executing shell.
    The default NAME is "COPROC".

그래서 그것은 다음과 같습니다:

echo "Starting Process..."
TARGET_ID=""
coproc (trap '' PIPE; ./target_executable < /dev/null & disown) # since it's in the bg, input won't be useful
while read -r line || [[ "$TARGET_ID" == "" ]] ; do
    TARGET_ID=$(echo "$line" | grep -oE 'Id = [0-9A-Z]+' | grep -oE '[0-9A-Z]{10,}')

    if [ "$TARGET_ID" != "" ]
    then
        echo "Processing $line '$TARGET_ID'"
        break
    fi
done <&${COPROC[0]} # redirect in from coprocess output

Bash는 보조 프로세스의 입력/출력을 위한 파이프를 설정하므로 애플리케이션은 끊어진 출력 파이프를 처리할 수 있어야 합니다. 모든 명령을 사용할 수 있는 것은 아닙니다. (그래서 SIGPIPE서브쉘에 갇혀있습니다.)

관련 정보