백그라운드 프로세스가 완료되고 프로세스 ID가 역방향으로 일치할 때까지 기다립니다.

백그라운드 프로세스가 완료되고 프로세스 ID가 역방향으로 일치할 때까지 기다립니다.

여러 개의 백그라운드 프로세스를 루프에서 실행하고 싶지만 모든 프로세스가 완료될 때까지 기다리면서 다른 백그라운드 프로세스는 계속 진행하고 싶습니다.

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
$

그래서 작동합니다.

관련 정보