여러 개의 백그라운드 프로세스를 루프에서 실행하고 싶지만 모든 프로세스가 완료될 때까지 기다리면서 다른 백그라운드 프로세스는 계속 진행하고 싶습니다.
wait
몇 가지 조사 끝에 단일 프로세스 ID와 역 매칭하는 대신 원하는 각 프로세스 ID를 나열하도록 요구하는 솔루션만 확인했습니다 . 비슷한 것이 있으면 wait != $pid
매우 유용할 것 같습니다 .
예시 스크립트:
#!/bin/bash
command1 &
pid=$!
for i in ${array[@]}; do
for n in $(seq 3); do
if [ $n -eq 1 ];
command2 > file &
else
command2 >> file &
fi
done
done
이 예에서는 모든 프로세스를 나열하기 위해 명령을 $pid
사용할 필요가 없다는 점을 제외하고는 각 프로세스가 완료될 때까지 기다리고 싶습니다 . wait
가능합니까?
답변1
그냥 뭔가 잘못됐어
wait
언급 한 바와 같이 help wait
:
ID(프로세스 ID 또는 작업 사양일 수 있음)로 식별된 프로세스를 기다리고 해당 프로세스의 종료 상태를 보고합니다. ID가 제공되지 않으면 현재 활성화된 모든 하위 프로세스가 대기되고 상태 0이 반환됩니다.
"계속 다른 백그라운드 프로세스를 계속 허용"하시겠습니까? 그냥 disown
. 귀하의 예를 따르십시오.
command1 & disown %1
command2 & command2 & command2 &
wait
답변2
다른 사람들이 말했듯이 프로세스 ID가 "아님"을 기다릴 방법이 없습니다. 그러나 이 코드 패턴은 나에게 그다지 나쁘지 않은 것 같아서 여러분이 원하는 것을 달성하기 위한 제안된 방법으로 제공하고 있습니다.
이는 Bash 배열을 사용하며 이를 목록으로 명령에 제공할 수 있습니다 wait
.
예
샘플 코드의 수정된 버전, cmd.bash
.
!/bin/bash
array[0]=1
array[0]=2
sleep 30 &
pid=$!
pidArr=()
for i in ${array[@]}; do
for n in $(seq 3); do
if [ $n -eq 1 ]; then
sleep 31 > file &
pidArr+=($!)
else
sleep 32 >> file &
pidArr+=($!)
fi
done
done
echo ${pidArr[@]}
sleep
이 예제에서는 백그라운드에서 실행할 수 있는 일부 장기 실행 작업을 시뮬레이션하기 위해 명령을 교체했습니다 . 그들은 대역 역할을 하는 것 외에는 아무 관련이 없습니다.
마지막 명령 echo
도 순전히 for 루프가 완료되면 어떤 일이 발생하는지 확인할 수 있습니다. 결국 우리는 wait
그것을 실제 명령으로 대체할 것이지만 너무 앞서 나가지는 말자.
예제 실행 #1
이제 프로그램을 실행하고 무슨 일이 일어나는지 살펴보겠습니다.
$ ./cmd.bash
24666 24667 24668
이제 확인해보면 ps
:
$ ps -eaf|grep sleep
saml 24664 1 0 22:28 pts/9 00:00:00 sleep 30
saml 24666 1 0 22:28 pts/9 00:00:00 sleep 31
saml 24667 1 0 22:28 pts/9 00:00:00 sleep 32
saml 24668 1 0 22:28 pts/9 00:00:00 sleep 32
조금만 기다리면 결국 이 모든 일이 이루어질 것입니다. 그러나 이는 프로세스 ID를 배열에 추가하면 echo
나중에 제거할 수 있음을 보여줍니다.
예시 #2
이제 해당 줄을 변경 하고 다음과 같이 echo
줄을 바꾸겠습니다 .wait
wait ${pidArr[@]}
이제 수정된 버전을 실행하면 모든 프로세스 ID를 기다리고 있는 것을 볼 수 있습니다.
$ ./cmd.bash
...약 30초 후
$
우리는 힌트를 얻습니다. 이런 식으로 우리는 모든 프로세스를 성공적으로 기다렸습니다. 빠른 확인 ps
:
$ ps -eaf|grep sleep
$
그래서 작동합니다.