다음 형식의 17개 서버 목록이 있습니다.
172.16.6.45 i-052463fs (test-mv1)
172.16.6.46 i-9e2263rf (test-mv2)
SSH/로그인을 통해 각 서버에 액세스하고 종료할 수 있는 스크립트를 원합니다. 이는 쉽지만 문제는 각 이전 서버가 아래에 있어야 하는 위에 표시된 특정 순서(목록 아래)로 종료해야 한다는 것입니다. 완전히 종료되기 전에 종료가 시작됩니다.
n초마다 핑을 보내고 k초 내에 응답이 없으면 중단되는 명령 뒤에 루프를 추가하는 방법이 있을까요?
답변1
다음을 수행할 수 있습니다.
while IFS=' (' read <&3 ip id name rest; do
ssh -n -o ConnectTimeout=3 -o BatchMode=yes -o HostKeyAlias="$name" "$ip" poweroff &&
while ping -qw 10 -c3 "$ip"; do
sleep 1
done
done 3< list.txt
이 코드에 대한 몇 가지 참고 사항:
- 우리는 사용이름어쩌면 HostKeyAlias의 일부로 더 의미가 있을 수도 있습니다
$id
. 이상적으로는 sshd 서버 호스트 키에 무언가를 추가해야 합니다. - 여기서는 무인 스크립트를 실행하기 때문에
-n
for 및 BatchMode를 사용합니다 . 이 목적을 위해 전용 항목을 지정할ssh
수도 있습니다 .UserKnownHostsFile
while
성공하지 못하면ssh
루프를 실행하지 않습니다. 이 경우 오류가 발생하면서 스크립트를 종료할 수도 있습니다. 서버를 종료할 수 없는 상황을 고려하여 while 루프의 반복에 상한을 추가할 수도 있습니다.- 우리 루프는 1초 간격으로 3개의 핑 프로브를 수행하고 10초 후에 포기합니다.
ping
(적어도 하나 이상의 프로브가 응답되면 Debian의 프로브는 true를 반환하며iputils
, 이는 실제 패킷 손실을 커버해야 합니다. 3개 프로브 중 2개 사이의 1초 지연은while ping -c1
루프와 같은 서버 초과를 방지합니다. 추가 3개를 보낸 후 지연 응답을 받지 못한 채 조사하면 서버가 IP 스택을 찢은 후 종료될 수 있는 충분한 시간을 제공할 수 있을 것입니다.
답변2
ssh host sudo shutdown -h -y now ; ping -c 1 host ; while [ $? = 0 ] ; do ping -c 1 host ; done