2016-06-29 19 views
-1

простой скрипт для того, чтобы выполнить перезагрузку на Linux машинеSSH + SSH застрял на удаленной машине

for i in $LIST_OF_LINUX_MACHINES 
do 
    ssh $LINUX_MACHINE /var/tmp/restart.sh 
done 

после запуска этого сценария пару раз,

несколько раз процесс SSH застрял! (И цикл застрял на текущей машине) -

так как это может быть - что может быть причиной того, что в редких случаях, SSH застрял

и как избежать этого?

+0

Указывает тайм-аут соединения * TCP *. Это не общая сумма времени, чтобы ваша команда была гарантирована до полной стоимости; множество других мест, кроме установления соединения на уровне TCP, могут повредить вещи. –

+0

BTW, BashFAQ # 68 могут представлять интерес: http://mywiki.wooledge.org/BashFAQ/068 –

+1

BTW (также), '$ LIST_OF_LINUX_MACHINES' - это запах кода по нескольким причинам. Одна из этих причин заключается в том, что вы используете его как список, но он * не является * списком, это строка (правильный способ хранения списка элементов - это массив, но итерация по массиву выглядит как 'для хоста в '$ {linux_machines [@]}"; do'). Другим является то, что имена переменных all-caps зарезервированы для переменных со значением для оболочки и операционной системы - см. Соответствующий POSIX spec @ http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html, 4-й абзац, имея в виду, что оболочка и env vars используют пространство имен. –

ответ

0

Я предлагаю нечто иное - вместо постоянной задержки между экземплярами, имея фиксированное максимальное количество экземпляров для запуска за раз. Например, с этим значением в 25:

numprocs=25 
timeout=5 
xargs -P "$numprocs" -J '{}' -n 1 -- \ 
    perl -e 'alarm shift; exec @ARGV' -- "$timeout" \ 
    ssh -nxaq -o ConnectTimeout=5 -o StrictHostKeyChecking=no '{}' /tmp/reboot.sh \ 
    <hostnames # if a file; use < <(awk ...) if a script providing per-line info 

Обратите внимание, что -J {} является расширение, которое позволяет избежать ошибок неявные в спецификации для (стандартов уполномочена) поведения -I {} xargs. Если он недоступен, вместо него можно использовать -I '{}' - но прочитайте страницу руководства, чтобы понять оговорки.

+0

только один вопрос - почему машинный IP не был раньше /tmp/reboot.sh? – Eytan

+0

'{}' заменяется фактическим именем хоста xargs при использовании '-J {}'. Это не может быть сделано оболочкой, потому что оболочка запускает только одну подкоманду - «xargs» - и именно эта команда отвечает за запуск всех отдельных процессов perl, каждый из которых вызывает один процесс 'ssh'. –

+0

см. Мое обновление в вопросе – Eytan

Смежные вопросы