좋아요, 다음과 같은 구조를 가진 간단한 스크립트가 있습니다. 무기한 실행되는 하위 프로세스가 있습니다. 현재로서는 사용자가 프로세스를 수동으로 종료할 때만 중지됩니다. 전화를 끊지 않고 사용자의 입력을 들을 수 있는 방법이 있는지 궁금합니다 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
.