У меня есть несколько простых сценариев, предназначенных для последовательного соединения, чтобы запустить определенный сценарий на наборе серверов, перечисленных в файле, по одному на строку.
Сценарий развертывания одного сервера содержит следующее:
1 #!/bin/bash
2
3 file=$1
4 host=$2
5
6 scp ${file} ${host}:/tmp/
7 USER=`whoami`
8 ssh -t -t $USER@${host} /tmp/${file}
9
10 ssh "${host}" /bin/rm /tmp/${file}
11 exit
Отлично работает на скрипте, который у меня есть, yum устанавливает конфиги tomcat и symlinks hadoop / hbase в каталог общего класса.
Второй основной файл - deploy-all.sh, предназначенный для анализа списка хостов и запуска сценария развертывания для всех них:
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
В результате сценарий запускается один раз, а затем цикл for прерывается ... Я получил что-то вроде следующего вывода:
$ ./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 хоста, поэтому я предполагаю, что это связано с тем, что stdio будет отключен после возникновения ssh. Кроме того, меня немного беспокоит ошибка tcgatattr.
Как я могу обойти это? Что именно вызывает ошибку tcgetattr (я даже не уверен, что это связано)?
На самом деле не так уж много сделано со скриптами оболочки, так что извините, если я упустил что-то действительно очевидное, любая помощь будет оценена.