programing

Bash 스크립트가 병렬로 제한된 수의 명령을 처리합니다.

megabox 2023. 4. 19. 22:52
반응형

Bash 스크립트가 병렬로 제한된 수의 명령을 처리합니다.

다음과 같은 bash 스크립트가 있습니다.

#!/bin/bash
wget LINK1 >/dev/null 2>&1
wget LINK2 >/dev/null 2>&1
wget LINK3 >/dev/null 2>&1
wget LINK4 >/dev/null 2>&1
# ..
# ..
wget LINK4000 >/dev/null 2>&1

단, 명령어가 완료될 때까지 각 행을 처리한 후 다음 행으로 이동하는 것은 시간이 많이 걸리기 때문에 한 번에 20개 라인을 처리한 후 20개 라인을 더 처리하고 싶습니다.

나는 생각했다wget LINK1 >/dev/null 2>&1 &명령어를 백그라운드로 전송하여 계속 진행하는데, 여기에는 4000개의 행이 있습니다.이는 동시에 기동해야 하는 프로세스의 수가 제한되는 것은 말할 것도 없고 퍼포먼스 문제도 발생한다는 것을 의미하기 때문에 이는 좋은 생각이 아닙니다.

현재 생각하고 있는 해결책 중 하나는 명령어 중 하나가 아직 실행 중인지 확인하는 것입니다.예를 들어 20줄 후에 이 루프를 추가할 수 있습니다.

while [  $(ps -ef | grep KEYWORD | grep -v grep | wc -l) -gt 0 ]; do
sleep 1
done

물론 이 경우 줄 끝에 &를 추가해야 합니다.하지만 이건 올바른 방법이 아닌 것 같아요.

각 20 행을 그룹화하여 다음 20 행으로 넘어가기 전에 완료될 때까지 기다리는 방법은 무엇입니까?이 스크립트는 동적으로 생성되므로 생성되는 동안 원하는 계산을 수행할 수 있습니다.그러나 wget을 사용할 필요는 없습니다.따라서 wget 고유의 솔루션은 전혀 도움이 되지 않습니다.

를 사용합니다.wait내장:

process1 &
process2 &
process3 &
process4 &
wait
process5 &
process6 &
process7 &
process8 &
wait

위의 예에서는 4가지 프로세스가 있습니다.process1...process4는 백그라운드에서 시작되고 셸은 다음 세트를 시작하기 전에 이러한 작업이 완료될 때까지 기다립니다.

GNU 매뉴얼:

wait [jobspec or pid ...]

각 프로세스 ID pid 또는 작업 사양 jobspec에서 지정된 하위 프로세스가 종료될 때까지 기다렸다가 마지막 명령의 종료 상태를 반환합니다.작업 규격이 지정되면 해당 작업의 모든 프로세스가 대기됩니다.인수를 지정하지 않으면 현재 활성화된 모든 하위 프로세스가 대기되며 반환 상태는 0입니다.jobspec도 pid도 셸의 활성 자식 프로세스를 지정하지 않은 경우 반환 상태는 127입니다.

병행 참조.그 구문은 와 비슷하다.xargs단, 명령어를 병렬로 실행합니다.

실은.xargs 명령을 병렬로 실행할 수 있습니다.특별한 게 있어요-P max_procs명령줄 옵션을 선택합니다.man xargs.

20개의 프로세스를 실행하고 다음 명령을 사용할 수 있습니다.

wait

모든 백그라운드 작업이 완료되면 스크립트가 대기하여 계속됩니다.

언급URL : https://stackoverflow.com/questions/19543139/bash-script-processing-limited-number-of-commands-in-parallel

반응형