Zookeeper集群自动启动脚本 -- export 的注意点

前提补充:咱们能够经过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

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启动起来了:

总结:

  1. export A=1 定义的变量,会对本身所在的shell进程及其子进程生效
  2. B=1 定义的变量,只对本身所在的shell进程生效
  3. 在script.sh定义的变量,在当前登陆的shell进程中, source script.sh时,脚本中定义的变量也会进入当前登陆的进程

启动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集群了.
在这里插入图片描述