2013-08-25 2 views
2

백그라운드에서 여러 Linux 시스템에서 스크립트를 실행하려고합니다. 내 bash는 스크립트는 다음과 같습니다병렬 원격 프로세스가 bash ssh를 완료 할 때까지 기다리십시오.

for i in {1..1000}; do 
    for j in {1..20}; do  
    ssh -n -f remotehost$j "sh -c 'cd /blah/; nohup ./script.sh $i > /dev/null 2>&1 &'" 
    NPROC=$(($NPROC+1)) 
    if [ "$NPROC" -ge 40 ]; then 
     echo "Waiting for work to finish" 
     wait 
     NPROC=0 
    fi   
    done  
done 

이 서버의 부하를 제한하고 40 개 프로세스의 순 주어진 시간에 20 개 호스트상에서 실행이 내 시도입니다. 이것은 작동하지 않지만 모든 프로세스는 동시에 시작됩니다. 원격 백그라운드 프로세스가 끝나기를 기다리는 방법이나 n 개 이상의 프로세스가 주어진 원격 호스트에서 시작하는 것을 방지하는 방법에 대해 알려주십시오.

답변

2

당신이 (20) 기계의 모든에 40 작업을 실행하려면이 작업을 수행 할 수 있습니다 병렬 :

parallel -j20 seq 1000 \| parallel -j40 -I I ssh server{} \''"cd /blah/; ./script.sh I"'\' ::: {1..20} 

전체 설치를 수행하려고합니다 10 초 설치; 이 실패하면 개인 설치; 실패 할 경우, 최소한의 설치 :

wget -O - pi.dk/3 | bash 

나 :

curl pi.dk/3/ | bash 

시계 빠른 도입에 대한 소개 비디오 : 튜토리얼 (남자 parallel_tutorial)를 통해 https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

워크. 명령 줄 을 사랑합니다.

0

포 그라운드에서 원격 프로세스를 실행하고 백그라운드에서 ssh을 넣어 : 당신은이 목적을 위해 특별히 디자인 된 도구를 사용한다

ssh -n -f remotehost$j "sh -c 'cd /blah/; ./script.sh $i > /dev/null 2>&1 '" & 
+0

매우 유망 해 보였지만 기다림이 작동하지 않아 모든 프로세스가 함께 시작됩니다. 입력이 올바른지 확인했지만 이것이 작동하지 않는 이유를 알 수 없습니다. – Atlas

+0

원격 명령이 표준 입력을 리디렉션하지 않는지 확인하십시오. 표준 파일 디스크립터 중 하나는 SSH 연결에 연결되어 있어야하므로 ssh는 원격 명령이 완료 될 때까지 기다립니다. – Barmar

1

. 내가 pssh (일명 병렬 ssh)을 사용하고, 꽤 잘 작동합니다.

또한 널리 사용되는 Linux 저장소에서 사용할 수 있습니다. 예를 들어 우분투에서는 sudo apt-get install pssh을 사용하여 설치할 수 있습니다.

0

당신은 프로세스의 수를 제한 할 xargs를 사용할 수 있습니다

maxPerServer=2 
for j in {1..20}; do 
    echo -n {1..1000} | xargs -P "$maxPerServer" -d ' ' ssh -n -f remotehost$j "sh -c 'cd /blah/; ./script.sh {} > /dev/null 2>&1 '" & 
done 

이 코드는 서버 당 최대 2 개 프로세스를 실행합니다.

+0

이 접근법도 시도했습니다. 스크립트는 잘 실행되지만 아무 일도 일어나지 않습니다. 즉 원격 프로세스가 시작되지 않습니다. – Atlas

+0

정말입니까? 스크립트의 끝 부분에''wait''를 넣으십시오. –

0

병렬 SSH 클라이언트 (pdsh, cssh, pssh 등)를 사용하는 것이 좋습니다.

관련 문제