응답하지 않는 서버를 건너뛰는 방법

응답하지 않는 서버를 건너뛰는 방법

여러 서버에서 실행되는 스크립트를 작성했습니다. 때때로 스크립트가 서버 중 하나에 멈춰서 프로세스를 종료하려면 Ctrl C를 눌러야 합니다. 그렇지 않으면 멈춰서 계속 연결을 시도합니다.

스크립트를 실행하는 동안 서버가 멈추거나 응답하지 않는 경우 스크립트가 다음 호스트로 이동하여 계속 실행될 수 있도록 해당 호스트를 건너뛸 수 있는 방법이 있습니까? 일반적으로 컨트롤 C를 누르면 전체 프로세스가 종료됩니다.

다음은 스크립트의 예입니다. 머신 3에 정지되어 있다고 가정합니다.

HOSTS=(MACHINE1 MACHINE2 MACHINE3 MACHINE4 MACHINE5)
for i in "${HOSTS[@]}"
do
  echo "$i"
  ssh -q "$i" uname -a
 done

스크립트가 OS X에서 실행 중입니다. 명령 을 사용해 보았지만 timeout불행히도 작동하지 않습니다.

답변1

직접 수행하여 잘못될 수 있는 모든 문제(호스트 응답 없음, 호스트가 중간에 응답 중지, 사용자가 Ctrl+C 누르기, 오류 보고 등)를 처리해야 하는 대신 다음 중 하나를 사용하세요.많은 기존 도구는 SSH를 통해 여러 시스템에서 명령을 실행할 수 있습니다..

mussh -t 4 -H <(printf '%s\n' "${HOSTS[@]}") -c 'uname -a'
pssh -t 4 -h <(printf '%s\n' "${HOSTS[@]}") uname -a
pdsh -u 4 -w "$(printf %s, "${HOSTS[@]}")" 'uname -a'

답변2

이를 수행하는 일반적인 방법은 다음을 사용하는 것입니다.이 명령은 쉘 스크립트에 SIGINT(Control-C에 의해 생성됨)를 무시한 다음 명령이 실행되기 전에 하위 쉘에서 SIGINT를 다시 활성화하도록 지시합니다.

trap "" INT
HOSTS=(MACHINE1 MACHINE2 MACHINE3 MACHINE4 MACHINE5)
for i in "${HOSTS[@]}"
do
    echo "$i"
    (trap - INT; ssh -q "$i" "uname -a")
done

관련 정보