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

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

나는 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사용 sshbatch mode동시에 생성됩니다. 이러한 각 백그라운드 작업에서 디렉토리에 stdout+stderr있는 이름의 파일로 분출되며 필요할 때 검사할 수 있습니다.host$logdir

wait마지막으로 내부 루프 끝에 있는 명령을 사용하여 다음 묶음을 시작하기 전에 한 묶음이 끝날 때까지 기다립니다 for.

답변2

다른 유틸리티가 필요하지 않은 스크립트에 대한 다음 수정 사항은 병렬로 실행되지만 호스트의 열린 파일 핸들 제한에 따라 제한이 발생할 수 있습니다.

for f in $(cat host.lst); do
       ./runScript.sh $f &
done

결과를 로그에 캡처하려면 > run.log뒤에 추가하여 done새 파일인 run.log.

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

관련 정보