일부 하위 프로세스가 종료되면 쉘 스크립트 종료

일부 하위 프로세스가 종료되면 쉘 스크립트 종료

웹 서버를 시작하고 일부 작업을 수행한 다음 두 번째 웹 서버를 시작하는 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 -nSIGCHLD에 트랩을 설정하고 plain을 호출할 수 있습니다 wait. 대시, ksh93, mksh 및 zsh에서는 작성할 수 있습니다.

trap 'kill $server_1_pid $server_2_pid; exit' CHLD
wait

모든 작업의 ​​실행이 완료될 때까지 SIGCHLD 트랩이 호출되지 않기 때문에 이는 bash에서는 작동하지 않습니다.

관련 정보