1000개가 넘는 원격 컴퓨터가 있습니다. 모든 컴퓨터에서 특정 명령을 병렬로 실행하고 싶습니다. 나는 순서대로 실행되는 다음 명령을 사용합니다.
for f in `cat host.lst`
do
./runScript.sh $f
done
호스트가 100개 있다고 가정합니다 host.lst
. runScript.sh
100개의 호스트에서 병렬로 실행 하고 싶습니다 . 또한 로그를 유지해야 합니다.
컴퓨터에 PSSH
.
나는 많은 연구를 했고 이러한 링크를 찾았지만 도움이 되지 않았습니다. 나는 그들이 어떻게 작동하는지 이해하지 못합니다:
누구든지 논리를 설명할 수 있나요?
답변1
logdir=`mktemp -d`
bunch=200
IFS=$'\n'
for hosts in $(< hosts.lst xargs -r -L "$bunch"); do
IFS=" ";
for host in $hosts; do
ssh -n -o BatchMode=yes "$host" './runScript.sh' 1>"$logdir/$host.log" 2>&1 &
done
wait
done
파일의 한 줄/줄에 1000(수천)개의 호스트가 나열되어 있다고 가정하고 hosts.lst
, 한 번에 이러한 호스트 그룹(200)을 선택하고, 해당 200개의 호스트 각각에서 runScript.sh
사용 중인 호스트가 생성된다고 가정 합니다 ssh
. batch mode
각 백그라운드 작업의 분출을 stdout+stderr
디렉터리에 있는 파일에 보관하여 필요할 때 검사할 수 있습니다.host
$logdir
마지막으로 wait
내부 루프 끝에 있는 명령을 통해 다음 그룹을 시작하기 전에 한 그룹이 완료될 때까지 기다립니다 for
.
답변2
스크립트에 대한 다음 수정 사항에는 추가 유틸리티가 필요하지 않으며 병렬로 실행되지만 열린 파일 핸들에 대한 호스트 제한에 따라 제한이 발생할 수 있습니다.
for f in $(cat host.lst); do
./runScript.sh $f &
done
결과를 로그에 캡처하려면 새 파일을 추가 > run.log
하고 저장하기만 하면 됩니다 .done
run.log
주요 변경 사항은 &
다음 명령을 실행하기 전에 프로세스가 완료될 때까지 기다리는 대신 백그라운드에서 프로세스를 실행하는 기능을 추가한 것입니다.