백그라운드 프로세스 중 하나가 종료된 후 즉시 종료하려면 bash "wait"를 사용하십시오.

백그라운드 프로세스 중 하나가 종료된 후 즉시 종료하려면 bash "wait"를 사용하십시오.

두 개의 백그라운드 서버 프로세스(종료는 문제가 발생했음을 의미함)를 포크하는 bash 스크립트를 작성하려고 하는데 스크립트가 종료됩니다.그 중 하나가 종료되면(다른 것을 기다릴 필요가 없습니다).

이것이 내가 지금까지 시도한 것입니다:

1번 시도

bash wait명령을 사용하십시오. 두 프로세스가 모두 완료될 때까지 기다리고 있기 때문에 작동하지 않습니다. 내 경우에는 두 개의 서버 프로세스가 실행 중이므로 프로세스가 완료되면 문제가 발생했다는 의미이므로 이 스크립트를 완전히 종료해야 합니다.

#!/usr/bin/env bash
set -e

./server1 &
pid1="$!"
./server2 & 
pid1="$!"

wait "$1"
wait "$2"

2번 시도

위와 동일하지만 waitpid를 지정하지 마십시오. 같은 행동을 하십시오.

...
pid2="$!"
wait

3번 시도

나는 서브 쉘을 사용하고 거기에서 종료하려고 시도했습니다. 그러나 이는 exit서브셸에서만 작동하므로 두 가지 백그라운드 프로세스가 완료될 때까지 기다립니다.

#!/usr/bin/env bash
set -e

( ./server1 || echo crash1; exit 1 ) &
( ./server2 || echo crash2; exit 2 ) &
wait

Bash에서 이를 달성할 수 있는 방법이 있습니까(백그라운드에서 두 개의 서버 프로세스를 포크하고 그 중 하나가 완료되자마자 종료)?

답변1

wait -n

에서 help wait:bash

이 옵션이 제공 되면 -n다음 작업이 종료될 때까지 기다렸다가 종료 상태를 반환합니다.

사용할 때 wait -n기다릴 것입니다다음작업이 종료되었습니다. 즉, 두 개의 백그라운드 작업 중 하나가 종료되면 호출이 wait -n반환됩니다. 작업의 종료 상태는 의 종료 상태로 표시되지만 wait -n어떤 작업이 종료되었는지는 알 수 없습니다.

-nwait옵션이 추가 되었습니다 bash-4.3-alpha.

관련 정보