Bash: 백그라운드에서 여러 for 루프

Bash: 백그라운드에서 여러 for 루프

이것이 백그라운드에서 여러 순차 프로세스를 시작하는 올바른 방법입니까?

for i in {1..10}; do
    for j in {1..10}; do
        run_command $i $j;
    done &
done;

어떤 경우에는 모든 것이 j순차적으로 처리되어야 i하지만 모든 것이 i동시에 처리되어야 합니다.

답변1

당신이 가지고있는 외부 루프는 기본적으로

for i in {1..10}; do
    some_compound_command &
done

some_compound_command그러면 백그라운드에서 10개의 동시 인스턴스가 시작됩니다. 가능한 한 빨리 시작되지만 정확히 "동시"(예: some_compound_command필요한 경우)는 아닙니다.매우시간이 짧다면 마지막 작업이 시작되기 전에 첫 번째 작업이 완료될 가능성이 높습니다.

그것이 루프라는 사실은 some_compound_command중요하지 않습니다. 즉, 표시되는 코드는 다음과 같습니다.옳은내부 j루프의 반복은 순차적으로 실행되지만 내부 루프의 모든 인스턴스( i외부 루프의 각 반복마다 하나씩)는 동시에 시작됩니다.

기억해야 할 유일한 점은 각 백그라운드 작업이 서브셸에서 실행된다는 것입니다. 이는 내부 루프의 한 인스턴스 내에서 이루어진 환경 변경 사항(예: 현재 작업 디렉터리에 대한 변경 사항을 사용하여 쉘 변수 값 수정 cd등)이 특정 백그라운드 작업 외부에 표시되지 않음을 의미합니다.

wait적어도 스크립트가 종료되기 전에 모든 백그라운드 작업이 실제로 완료될 때까지 기다리기 위해 루프 뒤에 명령문을 추가할 수 있습니다 .

for i in {1..10}; do
    for j in {1..10}; do
        run_command "$i" "$j"
    done &
done

wait

답변2

GNU Parallel이 있다면 다음과 같이 할 수 있습니다:

parallel -j0 'for j in {1..10}; do run_command {} $j; done' ::: {1..10}

한 가지 이점은 병렬 실행의 출력이 run_commands혼합되지 않는다는 것입니다.

관련 정보