이것이 백그라운드에서 여러 순차 프로세스를 시작하는 올바른 방법입니까?
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
혼합되지 않는다는 것입니다.