1.背景:shell脚本在主机器上执行kafka的启动命令,其他机器也会起这个进程。
之前的脚本每次执行的时候出现卡住的现象,不能回到命令行。
解决方法:
第一种
#/bin/bash
KAFKA_HOME=/opt/kafka
source /opt/wyl/cfg.config
su - hadoop <<EOF
for mm in ${ip[*]};do
echo "===>"\${mm}:
ssh hadoop@\${mm} "cd /opt/kafka ; nohup ./bin/kafka-server-start.sh ${KAFKA_HOME}/config/server.properties > /opt/kafka/kafka.log & [ $? -eq 0 ] && echo 'kafka is start...' "
done
EOF
其中ip就是所有需要执行的机器列表。 ssh hadoop@${mm}后续必须要跟双引号 其中分号是分隔命令的作用 /opt/kafka/kafka.log 是将日志打印到这个地方
第二种:
ssh root@ip << remotessh 首先要ssh上去,ssh的配置可以看我的上一篇文章,注意这里的<< remotessh 从这里开始都是在远程机器上执行命令啦 cd /tmp/test/ rm -f test.txt cat test.log | grep 'test’ >> test.txt echo “finished!”
执行完毕
exit ###不要忘记退出远程机器 remotessh ###还有这里的结尾哦,不要忘记
#!/bin/bash
2 KAFKA_HOME=/opt/kafka
3 source /opt/wyl/cfg.config
4 su - hadoop <<EOF
5 for mm in ${ip[*]};do
6 echo "===>"\${mm}:
7 ssh -Tq hadoop@\${mm} << remotessh
8 cd /opt/kafka #要顶格写,不然会报错的
9 nohup ./bin/kafka-server-start.sh ${KAFKA_HOME}/config/server.properties > /opt/kafka/kafka.log & #要顶格写,不然会报错的
10 [ $? -eq 0 ] && echo 'kafka is start...' #要顶格写,不然会报错的
11 exit
12 remotessh
13 done
14 EOF
这种方法执行脚本之后,会打印出
Pseudo-terminal will not be allocated because stdin is not a terminal.
字面意思是伪终端将无法分配,因为标准输入不是终端。 强迫症的人肯定感觉很烦的。 这个时候我们可以加上参数去解决这个问题。 所以需要增加-tt参数来强制伪终端分配,即使标准输入不是终端。 或者加上-Tq这个参数也可以。
加上-tt运行结果: ssh -tt hadoop@’xxxx’ 每个终端都打印出执行的命令 加上-Tq的运行结果 ssh -Tq hadoop@’xxxx’ 
|