원격 컴퓨터에서 스크립트를 병렬로 실행하는 방법은 무엇입니까?

원격 컴퓨터에서 스크립트를 병렬로 실행하는 방법은 무엇입니까?

SSH를 통해 64개 코어가 있는 원격 컴퓨터에 연결할 수 있습니다. 이 컴퓨터에서 640개의 쉘 스크립트를 병렬로 실행해야 한다고 가정해 보겠습니다. 어떻게 해야 하나요?

640개의 스크립트가 각각 10개의 스크립트로 구성된 64개의 그룹으로 나누어져 있는 것을 볼 수 있습니다. 그런 다음 각 그룹을 어떻게 실행합니까?평행하게즉, 사용 가능한 각 코어에 하나의 그룹이 있습니다.

양식의 스크립트가 있습니까?

    ./script_A &
    ./script_B &
    ./script_C &
    ...

script_A첫 번째 그룹, 두 번째 그룹 등에 해당하는 것은 무엇 script_B입니까? 충분합니까?

하나의 코어에서 실행되는 그룹 내의 스크립트는 순차적으로 실행될 수 있지만 그룹이 모든 코어에서 병렬로 실행되기를 원합니다.

답변1

이것은 GNU 병렬 작업처럼 보입니다.

parallel bash -c ::: script_*

장점은 스크립트를 핵심별로 그룹화할 필요가 없다는 것입니다. parallel우리가 대신해 드립니다.

물론 스크립트가 실행되는 동안 SSH 세션을 호스팅하지 않으려면 nohup또는를 사용해야 합니다.screen

답변2

이 접근 방식은 출력을 모니터링할 필요가 없고 스크립트가 실행되는 동안 SSH 세션을 열어 둘 수 있는 한 작동합니다. 이 중 하나라도 잘못된 경우 screen여러 탭을 사용하는 것이 좋습니다. 당신은 다음과 같은 것을 할 수 있습니다

screen
for script in script_A script_B script_C; do
  screen -t "$script" ./$script
done;

답변3

많은 수의 스크립트 작업을 시작하고 관리하려면 리소스 사용량(CPU, 메모리, 우선 순위)을 제어하고 작업 상태(대기 중, 보류 중, 실행 중, 완료됨)를 확인하는 일종의 관리 소프트웨어가 필요합니다.

그리드 엔진은 이러한 목적을 위해 구축되었습니다. 예를 들어 Sun Grid Engine(http://wiki.gridengine.info/wiki/index.php/Main_Page) 또는 오픈 그리드 스케줄러(http://gridscheduler.sourceforge.net/). 시작하기 전에 관리자가 적절한 소프트웨어를 설치해야 합니다. 관리자는 컴퓨터에서 실행되는 수백 개의 프로세스를 보고 제어할 수 없는 것보다 이 작업을 수행하는 것이 더 좋을 수 있습니다.

일반적으로 관리자는 시스템을 몇 개의 슬롯으로 나눌 수 있는지 정의합니다. 대기열에 작업을 제출하고 작업이 사용할 슬롯 수를 지정하면 Grid Engine이 시스템의 전체 사용량을 모니터링하고 그에 따라 작업을 실행합니다. 상황. 관리자가 대기열 전략을 정의했습니다. 예를 들어 동시에 x개 이상의 작업을 실행할 수 없습니다. 나머지 작업은 대기열에서 대기하다가 이전 작업이 완료된 후 해제됩니다.

답변4

나는 이것을 여러 번 해왔으며 일반적으로 작업 제어를 통해 작업을 수행하기 위해 스크립트를 직접 작성했습니다. 일반적으로 파일에서 실행하려는 모든 스크립트의 이름이 있는 경우 솔루션은 다음과 같습니다.

#!/bin/bash
scripts=$(cat scriptfiles.txt)
declare -i NUM=0
declare -i MAX_PROCS=30
for script in "$scripts"
do
  NUM=$((NUM+1))
  ssh remote.host.ip "${script}" > ${script}.log 2>&1 &
  if [ $NUM -ge $MAX_PROCS ];then
    echo "Waiting for $NUM processes to finish."
    wait
    NUM=0
  fi
done
echo "Waiting for final $NUM processes to finish."
wait
exit

그것은 무차별적인 힘이지만 작동합니다. 또한 시스템에 추가 소프트웨어(예: 병렬 처리)를 추가할 필요가 없습니다.

큰 문제는 wait 명령이 가장 느린 스크립트가 완료될 때까지 기다리므로 시간이 낭비될 수 있다는 것입니다. 나는 이 상황을 처리하기 위해 스크립트를 만들었지만 여러분이 상상할 수 있듯이 스크립트는 더 복잡해집니다. 이 접근 방식은 모든 스크립트를 실행하는 데 대략 동일한 시간이 걸리는 경우에 적합합니다.

또 다른 문제는 최적의 성능을 결정하기 위해 MAX_PROCS를 조정해야 할 수도 있다는 것입니다.

물론 SSH 연결 수가 관리하기 어려워질 수 있습니다. 이 경우에는 이 스크립트를 원격 호스트로 이동하고 "ssh..." 줄을 변경하여 스크립트를 직접 실행하면 됩니다.

관련 정보