![백그라운드 프로세스가 종료되면 포그라운드 프로세스를 안전하게 종료합니다.](https://linux55.com/image/96361/%EB%B0%B1%EA%B7%B8%EB%9D%BC%EC%9A%B4%EB%93%9C%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EA%B0%80%20%EC%A2%85%EB%A3%8C%EB%90%98%EB%A9%B4%20%ED%8F%AC%EA%B7%B8%EB%9D%BC%EC%9A%B4%EB%93%9C%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EB%A5%BC%20%EC%95%88%EC%A0%84%ED%95%98%EA%B2%8C%20%EC%A2%85%EB%A3%8C%ED%95%A9%EB%8B%88%EB%8B%A4..png)
두 개의 스크립트가 있습니다. 첫 번째는 배경에 있고 두 번째는 전경에 있습니다.
trap "ret=\$?; rm -f pipe1 pipe2; exit \$ret" EXIT INT TERM QUIT
my.bin > pipe1 < pipe2 &
my-term.sh pipe1 pipe2
my-term.sh
stdin/stdout을 통해 사용자와 상호 작용합니다(CLI 터미널 프로그램과 유사).
while read -ep "prompt> " l; do echo $l; done
my.bin
exit 0
시뮬레이션할 스크립트 입니다 .
my-term.sh
my.bin
어떤 이유로든 그만둘 경우 어떻게 종료하나요?
작동하는 것:
trap "ret=\$?; rm -f pipe1 pipe2; exit \$ret" EXIT INT TERM QUIT
(my.bin > pipe1 < pipe2; kill -9 $$) &
my-term.sh pipe1 pipe2
하지만 my-term.sh
청소가 중단될 수도 있습니다. 옳은 일은 무엇입니까?
답변1
일련의 신호를 시도하고 하나가 실패하면 3초를 기다린 후(수면 시간은 my-term.sh
수행해야 하는 작업에 따라 조정될 수 있음) 다른 신호를 시도하십시오.
(my.bin > pipe1 < pipe2; x=$$ ; \
for sig in SIGTERM SIGINT SIGQUIT SIGABRT SIGKILL ; \
do kill -${sig} $x && break ; sleep 3s ; done ; ) &
my-term.sh pipe1 pipe2