前提补充:咱们能够经过ssh操做另外一台机器
测试:web
ssh bd2 mkdir /root/bd1
上面的这条命令就能够在 bd2 上新建一个文件夹了 bd1shell
尝试在bd1上启动bd2的zookeeper服务:bash
ssh bd2 /root/apps/zookeeper-3.4.5/bin/zkServer.sh start
可是发现 bd2 上面的 zookeeper并无启动
缘由是zookeeper启动的时候须要一些环境变量,特别是JAVA_HOME,而在bd1上使用ssh的时候其实只是一个bash的会话,在这个会话里面是没有这个JAVA_HOME的,因此启动不了app
技术点: export 的知识点ssh
a=1 echo $a
编写 s1.sh 脚本svg
#!/bin/bash echo $a
执行这个脚本:测试
发现并无打印以前定义的a
缘由是:
使用pstree 查看:
注意 bash这个进程 里面定义了一个变量a
当执行 ./s1.sh的时候会在bash进程下面开启一个新的进程,那么这个新的进程是不能获取到父进程 bash 的变量的code
unset a 将设置的变量进行撤销
使用export来定义变量:xml
export a=1
而后执行脚本 ./s1.sh 会将这个变量a的值打印出来blog
再来一个测试的例子:
s1.sh:
a 在外面使用 export进行定义了 而且在 s1.sh里面调用了上s2.sh
执行 s1.sh:
在s2.sh里面打印的b是没有值的,若是在s1.sh对b这个变量使用export修饰的话,那么在上里面的b是能够打印出来的:
可是须要注意的一点:
在外面. 变量a的值是能够获取的,可是变量b的值是没法获取的
缘由是:export出来的变量只有当前进程以及当前进程的子进程里面才有,在父进程里面是没用的
那么若是让export修饰的变量在父进程里面也有用?
source 会把定义在脚本文件里面的变量,放到当前这个shell里面,而export会把变量放在它的进程里面以及子进程里面.
因此回到原问题:
ssh bd2 /root/apps/zookeeper-3.4.5/bin/zkServer.sh start
这种状况是没有JAVA_HOME的
由于使用ssh进行操做会跟bd2的进程处以同一个进程中
因此应该使用source
ssh bd2 "source /etc/profile;/root/apps/zookeeper-3.4.5/bin/zkServer.sh start"
zookeeper启动起来了:
总结:
启动zookeeper集群的脚本:
#!/bin/bash echo "Starting zkServer ..." for i in 1 2 3 do ssh bd$i "source /etc/profile;/root/apps/zookeeper-3.4.5/bin/zkServer.sh start" done
chmod +x startzk.sh
startzk.sh这个脚本所在的目录是:
/root/bin
为了能够在任意的地方都运行这个脚本,因此要把这个脚本所在的目录配置在环境变量里面:
你会发现 这个 /root/bin自己就在环境变量里面,若是是其余的目录则应该在 PATH上面进行追加
配置了免密登陆的话,直接 ./startzk.sh就能够启动zookeeper集群了.