`$(nproc)`× `openssl dhparam`의 병렬 인스턴스를 실행하는 방법과 첫 번째 인스턴스가 `0`으로 종료되면 다른 인스턴스를 종료합니까?

`$(nproc)`× `openssl dhparam`의 병렬 인스턴스를 실행하는 방법과 첫 번째 인스턴스가 `0`으로 종료되면 다른 인스턴스를 종료합니까?

나는 그것을 실행하고 openssl dhparam -out dhparam4096.pem 4096있으며 작업 기간 동안 단일 코어를 100%로 고정합니다(일부 프로세서에서는 상당히 클 수 있음). 기본적으로 유휴 상태인 추가 코어가 1개 이상 있는데 이를 사용하고 싶습니다.

$(nproc)이 명령의 인스턴스를 × 실행하고 싶습니다 . 차이점은 모든 인스턴스를 완료할 필요는 없다는 것입니다. 첫 번째 인스턴스만 종료하면 됩니다. 일단 "승자" 인스턴스가 완료되면 0나머지 프로세스는 "d" 또는 유사해야 하며 그럴 필요가 없습니다. 우아해 .SIGTERM

parallel나는 이것을 배우고 성취하는 과정에 xargs있으며 그것을 수행하는 방법에 대한 많은 방법 기사가 있습니다.모두병렬 작업이지만 검색 엔진에서는 위의 목표를 달성할 수 없습니다. 나는 parallelor 을 사용하는 아이디어를 좋아하지 않습니다 .xargs병렬 대안나는 읽을 방법을 찾으면 그것을 내 독서 목록에 추가합니다.

종료하는 첫 번째 인스턴스가 다른 $(nproc)인스턴스를 종료하는 명령의 인스턴스를 실행하는 방법은 무엇 입니까?0

추가 정보: Debian 11, aarch64 bash, .

답변1

대화형 쉘 프롬프트에서 다음을 수행하십시오 zsh.

(repeat $(nproc) { {your-command && kill 0} & }; wait)

서브셸은 새 프로세스 그룹에서 실행되며, your-command성공적으로 종료되는 첫 번째 인스턴스는 kill 0프로세스 그룹 종료를 트리거합니다.

parallel다음과 같은 작업을 수행할 수 있습니다 moreutils.

parallel sh -c 'your-command && kill 0' -- {1..$(nproc)}

( {1..5}zsh의 는 이제 다른 많은 쉘과 심지어 bash에서도 지원되지만 bash에서는 수정되지 않았다고 가정하고 확장을 사용할 수 없으며 $(seq "$(nproc)")언제든지 로 바꿀 수 있습니다 $IFS.)

또는 GNU를 사용하십시오 xargs:

seq "$(nproc)" | xargs -P0 -n1 sh -c '
  your-command && kill 0'

또는 각 작업을 각 CPU에 명시적으로 바인딩합니다.

seq 0 "$(( $(nproc) - 1))" | xargs -P0 -ICPU taskset -c CPU sh -c '
  your-command && kill 0' sh-on-cpuCPU

매번 핵심은 모든 명령이 자체 프로세스 그룹에 있도록 대화형 셸의 프롬프트에서 실행하는 것입니다.

답변2

코어가 10000개 미만인 경우:

seq 10000 | parallel -N0 --halt now,success=1 openssl dhparam -out dhparam4096.pem 4096

관련 정보