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


16

64 개의 코어가있는 원격 시스템으로 ssh 할 수 있습니다. 이 컴퓨터에서 640 개의 셸 스크립트를 병렬로 실행해야한다고 가정하겠습니다. 어떻게해야합니까?

640 스크립트를 10 개의 스크립트 각각 64 개 그룹으로 나누는 것을 볼 수 있습니다. 그런 다음 각 그룹 을 병렬 로 실행하는 방법 , 즉 사용 가능한 코어 중 하나에 각각 하나의 그룹을 어떻게 실행합니까 ?

양식의 스크립트

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

여기서 script_A첫 번째 그룹에 대응하고, script_B두 번째 그룹 등 충분할에?

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


코어에 의해 균등하게 분배되는 것은 아닙니다. 이 스레드를 살펴보십시오. stackoverflow.com/questions/13583146/…
Rui F Ribeiro

답변:


24

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

parallel bash -c ::: script_*

장점은 스크립트를 코어별로 그룹화하지 않아도 parallel된다는 것입니다.

물론 스크립트가 실행되는 동안 SSH 세션을 보모하지 않으려면 nohup또는screen


좋은 답변이며 일반적인 경우와 같이 잘 작동합니다. 불행히도 개인적으로 원격 컴퓨터에 대한 관리자 권한이 없으므로 parallel패키지를 설치할 수 없습니다 . 감사합니다
Tom Tom

10
전역 적으로 병렬을 설치할 필요는 없습니다. 자신의 홈 디렉토리에서 사본을 실행할 수 있어야합니다.
dhag

bash -c필요하지 않을 수도 있습니다 : parallel ::: ./script*. 640 스크립트를 사용하면 매우 유사 할 수 있습니다 (예 : 인수 만 다름). 이를 위해 GNU Parallel을 직접 사용하여 이러한 인수를 설정하고 단일 스크립트를 사용하십시오.
Ole Tange

원격 컴퓨터에 GNU 병렬을 어떻게 설치합니까?
Tom

@Tom 원격 컴퓨터를 사용하고 있다는 사실은 무엇입니까? gnu.org/software/parallel 에서 올바른 패키지를 가져 와서 설치하십시오.
Dmitry Grigoryev

5

출력을 모니터링 할 필요가 없으면 스크립트가 실행되는 동안 ssh 세션을 열어 두는 것이 좋습니다. 둘 중 하나라도 맞지 않으면 screen여러 개의 탭을 사용 하는 것이 좋습니다 . 당신은 같은 것을 할 수 있습니다

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

관심없는 출력 모니터링-ssh 세션을 열어두고 싶지 않습니다. nohup을 사용하는 것은 어떻습니까? 세션이 종료되면 스크립트가 중지되지 않습니다. 또한 '스크린 권장 사항을 살펴 보겠습니다. 감사!'
Tom

nohup아마도 잘 작동 할 것입니다. 나는 더 친숙 screen하고 당신에게 유용하거나 유용하지 않을 더 많은 기능을 가지고 있습니다.
David King

2

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

그리드 엔진은 예를 들어 Sun Grid Engine ( http://wiki.gridengine.info/wiki/index.php/Main_Page ) 또는 Open Grid Scheduler ( http://gridscheduler.sourceforge.net/ )와 같이 구축됩니다. 시작하기 전에 관리자가 적절한 소프트웨어를 설치해야합니다. 관리자는 머신에서 실행중인 수백 개의 프로세스를 보지 않고 제어 할 수있는 권한을 가지지 않고 기꺼이 그렇게 할 수 있습니다.

일반적으로 관리자는 머신을 분할 할 수있는 슬롯 수를 정의하고 작업을 대기열에 제출하고 작업에 사용하고자하는 슬롯 수를 지정하면 그리드 엔진이 전체 시스템 사용량을 모니터링하고 다음에 따라 작업을 실행합니다. admin에 의해 정의 된 큐잉 정책 예를 들어 x 개 이하의 작업을 동시에 실행할 수 없습니다. 나머지 작업은 대기 상태로 대기하고 이전 작업이 완료된 후에 해제됩니다.



0

나는 여러 차례에 걸쳐 이것을 해왔으며 일반적으로 작업 제어로 작업을 수행하기 위해 자체 스크립트를 롤링합니다. 일반적으로 파일에서 실행하려는 모든 스크립트의 이름이 있으면 솔루션은 다음과 같습니다.

#!/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 ..."행을 변경하여 스크립트를 직접 실행하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.