사용 가능한 CPU가 있는 경우 제어 하에 여러 "직렬" 프로세스를 어떻게 실행할 수 있습니까? [복사]

사용 가능한 CPU가 있는 경우 제어 하에 여러 "직렬" 프로세스를 어떻게 실행할 수 있습니까? [복사]

maaaaaaaa모든 파일에서 실행되어야 하는 바이너리가 있다고 가정합니다(파일 번호가 1부터 N까지 지정되어 있다고 가정). 각 파일은 이 바이너리(즉, md5sum과 같은 것)를 호출하여 처리되어야 합니다. 각 실행은 결과를 별도의 파일에 저장합니다. 따라서...1000개의 파일이 있고 CPU가 4개만 있는 경우 다음과 같은 작업을 수행하고 싶지 않습니다(실제로 가능하더라도).

i=0; while [ $i -lt 1000 ]; do md5sum a_file_$i > result_$i & i=$(( $i + 1 )); done

(비록 bash가 불평하지 않더라도) 우리는 결국 1000개의 프로세스를 시작하게 되고, 이로 인해 컴퓨터는 크롤링 모드로 전환됩니다.

한 번에 n개의 프로세스처럼 실행되어야 한다고 말할 수 있는 명령이 있습니까(n개의 프로세스를 시작하고, 한 프로세스가 완료되면 모니터링한 다음, 프로세스 수가 완료되도록 다른 프로세스를 시작합니다)달리기항상 n)?

답변1

암소 비슷한 일종의 영양평행선당신이 찾고있는 도구입니다. 작가,올레 데인저, 이곳을 정기적으로 방문하는 사람이며 몇 가지 좋은 답변을 작성했습니다.그것에 관한 질문

xargsfrom 의 GNU 버전은 findutils여러 작업을 병렬로 실행하기 위한 몇 가지 옵션도 제공합니다. 귀하와 같은 간단한 작업에는 사용하기가 더 쉬울 수 있지만 그만큼 좋지는 않습니다 parallel.

예를 들어:

find . -maxdepth 1 -type f -name 'a_file_*' -print0 | 
  xargs -0r -L 1 -P 4 sh -c '/usr/bin/md5sum "$1" > "$1.md5sum"' {}

이 실행됩니다에 따라md5sum4개의 작업을 병렬로 실행합니다( -P 4). 또한 각 작업을 한 번에 하나의 파일 이름으로 처리하도록 제한하는 옵션을 사용했습니다 -L 1. 그렇지 않으면 1000개의 파일 이름으로 1개의 작업만 실행됩니다.

관련 정보