【发布时间】:2015-09-29 06:04:04
【问题描述】:
我写了一个 scipt 来执行一些与 apachestorm 相关的 ssh 远程命令。当我执行脚本时它说:
ssh: connect to host XXX.XXX.XXX.XXX port 22: No route to host
ssh: connect to host XXX.XXX.XXX.XXX port 22: No route to host
ssh: connect to host XXX.XXX.XXX.XXX port 22: No route to host
ssh: connect to host XXX.XXX.XXX.XXX port 22: Connection refused
如果我手动执行命令,它运行良好,我可以 ping 机器。所以这段代码肯定有问题:
while [ $i -le $numVM ]
do
if [ $i -eq 1 ];then
ssh -i file root@IP1 './zookeeper-3.4.6/bin/zkServer.sh start'
else
ssh -i file root@IP2 'sed -i '"'"'s/#\ storm.zookeeper.servers.*/storm.zookeeper.servers:/'"'"' /root/apache-storm-0.9.3/conf/storm.yaml'
ssh -i file root@IP2 'sed -i '"'"'0,/^#[[:space:]]*-[[:space:]]*\"server1\".*/s//" - \"'${IParray[1]}'\""/'"'"' /root/apache-storm-0.9.3/conf/storm.yaml'
ssh -i file root@IP2 'sed -i '"'"'s/#\ nimbus.host:.*/"nimbus.host: \"'${IParray[2]}'\""/'"'"' /root/apache-storm-0.9.3/conf/storm.yaml'
ssh -i file root@IP2 './zookeeper-3.4.6/bin/zkCli.sh -server ${IParray[1]} &'
sleep 10
ssh -i file root@IP2 './apache-storm-0.9.3/bin/storm nimbus &' &
sleep 10
ssh -i file root@IP2 './apache-storm-0.9.3/bin/storm ui &' &
sleep 10
ssh -i file root@IP2 './apache-storm-0.9.3/bin/storm supervisor &' &
fi
((i++))
done
我正在从同一映像部署的 2 个虚拟机上启动多个进程,因此它们通常是相同的。令人困惑的是,第一个 ssh 命令(zkServer.sh start)运行良好,但如果我的脚本尝试执行三个“sed”-ssh-commands,我会收到上面的错误消息。但是最后四个 ssh 命令再次运行良好。这对我来说没有任何意义......
【问题讨论】:
-
尝试在执行命令之前打印出命令,或者使用
set -x让 bash 向您展示它在每一步都在做什么。也许其中一个变量没有按照您期望的方式扩展?我看到在某些行中你有$IP2而其他你只有IP2也许这就是问题所在? -
不,实际上它是一个数组 (${IParray[$i]}) 我使用 IP1 和 IP2 使其更简短,对其他人来说更清晰。但我会尝试 set -x 并详细检查脚本的作用。感谢您的回答
-
好的,我查过了。该命令的 bash 输出似乎很好,在执行后再次显示“没有到主机的路由”。我复制了命令并手动执行它,它可以工作。这怎么可能?
-
您的阵列中是否有一些不可打印的字符,例如 IP2 末尾的
\r而 IP1 不存在? -
不,在这种情况下,当我复制由于“set -x”而显示的命令时,我认为它也不应该成功。但它确实使命令在一般情况下是正确的?