다른 프로세스가 실행될 때까지 기다리지 않고 사용자 입력을 듣습니다.

다른 프로세스가 실행될 때까지 기다리지 않고 사용자 입력을 듣습니다.

좋아요, 다음과 같은 구조를 가진 간단한 스크립트가 있습니다. 무기한 실행되는 하위 프로세스가 있습니다. 현재로서는 사용자가 프로세스를 수동으로 종료할 때만 중지됩니다. 전화를 끊지 않고 사용자의 입력을 들을 수 있는 방법이 있는지 궁금합니다 read. 즉, 하위 프로세스가 실행되는 동안 사용자가 \n터미널에 "quit"을 입력하는지 백그라운드에서 살펴보세요.

...

if [[ option = "3" ]]; then
    while [2 -lt 4]; #THIS IS WHERE I WANT TO CHANGE TO LISTENING FOR INPUT TO QUIT
        #Some sub process that continues to run
    done
fi

....

도와주셔서 감사합니다! 표현이 나쁘다면 죄송합니다. 이 질문을 더 잘 설명할 수 있는 방법이 없습니다. 브레인스토밍 시도에 관해서는 while조건에서 변수를 사용하고 "종료"가 될 때까지 이 작업을 수행할 수 있다는 것을 알고 있지만 해당 변수를 입력으로 설정하는 것은 내가 잃어버린 곳입니다.

답변1

을 사용하여 백그라운드에서 프로세스를 실행 &한 다음 read사용자의 백그라운드에서 실행하고 둘 중 하나가 완료될 때까지 기다릴 수도 있습니다. 당신은 다음과 같은 것으로 끝날 것입니다

mylongrunningcommand &
pid1=$!
echo "enter quit to stop"
while read reply && [ quit != "$reply" ]
do  :
done </dev/stdin &
pid2=$!
wait -n
echo "got quit or command done"
kill -9 $pid1 $pid2
wait

read루프 안에 있으므로 "quit"를 여러 번 입력해 볼 수 있습니다 . 배경 때문에 표준 입력을 리디렉션해야 합니다. 백그라운드 작업 중 하나가 완료되면 반환되며 wait -n, 어떤 작업이 완료되었는지 모르기 때문에 kill은 두 작업의 프로세스 ID를 모두 종료합니다.

위 코드는 종료된 프로세스에 대해 bash에서 일부 메시지를 생성합니다. 이를 억제하려면 마지막 두 줄을 다음으로 바꾸십시오.

exec 3>&2 2>/dev/null
kill -9 $pid1 $pid2
wait
exec 2>&3 3>&-

그러면 일시적으로 stderr이 /dev/null.

관련 정보