쉘 스크립트를 사용하여 여러 서버에서 병렬로 명령 실행

쉘 스크립트를 사용하여 여러 서버에서 병렬로 명령 실행

1000개가 넘는 원격 컴퓨터가 있습니다. 모든 컴퓨터에서 특정 명령을 병렬로 실행하고 싶습니다. 나는 순서대로 실행되는 다음 명령을 사용합니다.

for f in `cat host.lst`
do
       ./runScript.sh $f
done

호스트가 100개 있다고 가정합니다 host.lst. runScript.sh100개의 호스트에서 병렬로 실행 하고 싶습니다 . 또한 로그를 유지해야 합니다.

컴퓨터에 PSSH.

나는 많은 연구를 했고 이러한 링크를 찾았지만 도움이 되지 않았습니다. 나는 그들이 어떻게 작동하는지 이해하지 못합니다:

많은 서버에서 SSH를 통해 명령 실행 자동화

패턴과 일치하는 여러 파일에 대해 병렬로 명령 실행

누구든지 논리를 설명할 수 있나요?

답변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하고 저장하기만 하면 됩니다 .donerun.log

주요 변경 사항은 &다음 명령을 실행하기 전에 프로세스가 완료될 때까지 기다리는 대신 백그라운드에서 프로세스를 실행하는 기능을 추가한 것입니다.

관련 정보