![일부 하위 프로세스가 종료되면 쉘 스크립트 종료](https://linux55.com/image/7459/%EC%9D%BC%EB%B6%80%20%ED%95%98%EC%9C%84%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%EC%89%98%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%20%EC%A2%85%EB%A3%8C.png)
웹 서버를 시작하고 일부 작업을 수행한 다음 두 번째 웹 서버를 시작하는 Bash 스크립트가 있습니다. 스크립트를 종료하고 싶습니다. 서버가 종료되거나 사용자가 Ctrl+ 를 입력하면 두 서버가 모두 종료됩니다 C.
내가 지금 가지고 있는 것은 다음과 같습니다.
start_server_1 &
server_1_pid=$!
trap "kill $server_1_pid" EXIT
# ...do some work that requires server 1 to be running...
start_server_2 || exit $?
사용자가 Ctrl+를 입력하면 두 서버가 모두 올바르게 종료됩니다 C. 그러나 서버 1이 종료되면 서버 2와 스크립트 자체는 계속 실행됩니다. 이러한 프로세스 중 하나가 종료되면 서버와 스크립트가 모두 종료되도록 하려면 어떻게 해야 합니까?
답변1
이 두 프로세스를 백그라운드에서 실행한 다음wait -n
그 중 하나가 종료될 때까지 기다리십시오.
Bash는 어떤 프로세스가 종료되었는지 보고하지 않지만 다음을 실행할 수 있습니다.jobs -p
아직 실행 중인 백그라운드 작업 목록을 가져와서 종료합니다.
start_server_1 &
server_1_pid=$!
start_server_2 &
server_2_pid=$!
wait -n
kill $(jobs -p)
wait -n
배쉬 4.3의 새로운 기능. 이전 버전에서는 이 작업이 훨씬 더 어려웠습니다.
다른 일반적인 쉘은 그렇지 않지만 wait -n
SIGCHLD에 트랩을 설정하고 plain을 호출할 수 있습니다 wait
. 대시, ksh93, mksh 및 zsh에서는 작성할 수 있습니다.
trap 'kill $server_1_pid $server_2_pid; exit' CHLD
wait
모든 작업의 실행이 완료될 때까지 SIGCHLD 트랩이 호출되지 않기 때문에 이는 bash에서는 작동하지 않습니다.