2010-04-13 3 views
0

한 줄에 하나씩 나열된 모든 서버 집합에서 특정 스크립트를 실행하기 위해 함께 데이지 체인으로 연결되는 몇 가지 간단한 스크립트가 있습니다.왜 bash 루프 배포 스크립트는 한 번만 작동하는 것처럼 보입니까?

단일 서버 배포 스크립트는 다음이 포함

1 #!/bin/bash 
    2 
    3 file=$1 
    4 host=$2 
    5 
    6 scp ${file} ${host}:/tmp/ 
    7 USER=`whoami` 
    8 ssh -t -t [email protected]${host} /tmp/${file} 
    9 
10 ssh "${host}" /bin/rm /tmp/${file} 
11 exit 

그것은 내가 냠가 공유 클래스 디렉토리에 바람둥이와 심볼릭 링크 하둡/HBase와의 CONFIGS를 설치하는 것이이 스크립트에서 잘 작동합니다.

1 #!/bin/bash 
    2 
    3 script=$1 
    4 
    5 cat dumbo-hosts | while read fileline 
    6 do 
    7 echo ${fileline} 
    8 ./deploy.sh ${script} ${fileline} 
    9 
10 sleep 10 
11 done 

무엇 발생하면, 스크립트가 한 번 실행한다는 것입니다과 :

두 번째 주요 파일은 호스트 목록을 구문 분석하고 그들 모두에 배포 스크립트를 실행하도록하는 deploy-all.sh입니다 그래서 그것을 한 번 끊어지고 표준 입출력과 관련된 뭔가 추정 내가 주석 경우

$ ./deploy-all.sh setup-tomcat.sh 
line is hadoop01.myhost 
setup-tomcat.sh        100% 455  0.4KB/s 00:00  
tcgetattr: Inappropriate ioctl for device 
hadoop02.myhost 
hadoop03.myhost 
hadoop04.myhost 
<succesful output of hadoop01 task> 
... 
Connection to hadoop01.myhost closed. 

는 SSH 루프가 4 개 호스트를 통해 성공적으로 실행 명령 : 다음 for 루프가 고장 ... 나는 다음과 같은 출력과 같이있어 ssh가 발생합니다. 또한 tcgatattr 오류는 다소 우려됩니다.

어떻게이 문제를 해결할 수 있습니까? 정확하게 tcgetattr 오류를 일으키는 것은 무엇입니까 (관련이 있는지 확실하지 않습니다)? 셸 스크립트를 많이 사용하지 않아서 정말 미안하다면 정말 도움이 될만한 도움이 될 것입니다.

답변

1

그것은 서브 프로세스의 일부로 실행할 때 SSH는 표준 입력 파일 디스크립터를 재사용에 문제가있다 :

여기 내 솔루션입니다.

해결 방법은 비 터미널 컨텍스트에서 ssh를 호출 할 때 '-n'을 사용하는 것입니다.

option=-n 
tty -s 2>/dev/null && option= 

scp ${file} ${host}:/tmp/ 
ssh $option -t ${host} /tmp/${file} 
ssh $option ${host} rm /tmp/${file} 
+0

해결 된 문제입니다. 감사합니다. 아직도 점점 : tcgetattr : 장치에 부적절한 ioctl 오류가 있지만 스크립트가 올바르게 실행되고 있습니다. – juhanic

+0

ssh에 '-t'옵션이 있다고 생각합니다. ssh의 최신 버전에는 더 이해하기 쉬운 오류 메시지가 있다고 생각합니다. – Petesh

+0

'rsh'와 동일한 문제와 수정. – mustaccio

0

나는 bash 배열을 사용하여 stdin 인터럽트를 피하기 위해 라인을 배열에 임시 저장하는 방법으로이 문제를 해결했습니다 ...하지만 잘못 생각합니다 ... 누군가이 문제를 해결할 더 좋은 방법이 있다면 알려 주시기 바랍니다.

1 #/bin/bash 
    2 
    3 #myscript = $1 
    4 count=0 
    5 
    6 declare -a lines 
    7 
    8 while read line 
    9 do 
10 lines[$count]=$line 
11 ((count++)) 
12 done < dumbo-hosts 
13 
14 for i in "${lines[@]}" 
15 do 
16 echo "$i" 
17 ./deploy.sh "$1" "${i}" 
18 done 
관련 문제