@loa_in_ имеет большую его часть, но конвейерный вывод find
имеет тенденцию быть ошибочным.
find /tmp/foo -maxdepth 1 -mindepth 1 -type d -exec mkdir {}/bar \;
Самое простое решение — установить тайм-аут соединения на некоторое разумное время.
ssh -o ConnectTimeout=10 -i $key_path -p 2222 $user@$i "sudo init 0" &> /dev/null
10 секунд должно хватить.
Вы также можете использовать некоторые другие инструменты для автоматизации задач -, например Ansible.
Если у вас есть «не отвечающая» зависимость, вы можете просто продолжить работу без exit 1
и еще несколько раз повторить попытку соединения ssh
:
for i in $host
do
counter=0
while [ $counter -ne 3 ]; do
# echo "Shutting down Host in $Region with ip addrss $i"
ssh -o ConnectTimeout=10 -i $key_path -p 2222 $user@$i "sudo init 0" &> /dev/null
if [ $? -ne 0 ]; then
echo "$i is shutdown!"
counter=3
else
echo "There is some issue, try again"
counter=$(($counter+1))
fi
done
done
Лучшим вариантом было бы сначала увидеть, что сервер обслуживает ssh, используя NMAP или NC
Nmap:Это очень быстро и надежно, но требует установки nmap. Предпочтительный метод NMAP (ex host ip 127.0.0.1):
nmap 127.0.0.1 -PN -p ssh | grep open
Nc:nc обычно уже установлен, однако в некоторых системах, таких как Mac OS X, команда зависает в недоступных системах.(см. обходной путь)
nc -v -z -w 3 127.0.0.1 22 &> /dev/null && echo "Online" || echo "Offline"
Примечание. :Пользователи MAC столкнутся с проблемой отсутствия тайм-аута NC на момент написания этой публикации 5/2019