今天搞了一个shell脚本来快速启动zookeeper
我使用的环境是在:
- centos-7
- zookeeper3-5-7
- jdk-1.8_212
问题描述
使用脚本来start zookeeper,结果出现JAVA_HOME未找到
zk.sh是我的脚本,底下是里面的脚本内容
#!/bin/bash
if [ $# -lt 1 ]
then
echo "No Args Input..."
exit ;
fi
case $1 in
"start")
for i in master slave1 slave2
do
echo "===================== $i ======================="
ssh $i "/opt/module/zookeeper/bin/zkServer.sh start"
done
;;
"stop")
for i in master slave1 slave2
do
echo "===================== $i ======================="
ssh $i "/opt/module/zookeeper/bin/zkServer.sh stop"
done
;;
"status")
for i in master slave1 slave2
do
echo "===================== $i ======================="
ssh $i "/opt/module/zookeeper/bin/zkServer.sh status"
done
;;
*)
echo "Input Args Error..."
;;
esac
环境变量写在/etc/profile文件里面,如图:
原因分析:
据网上查找到的资料发现,登录Linux的方式不同,会导致自动加载环境有差异,
既不同的登录模式会启动不同的bash模式
:
- 通过ssh远程登录虚拟机后再启用脚本和命令
- 这种方式会使用Bash的
interactive + login shell
模式,在interactive + login shell
模式中,Shell首先会加载/etc/profile
文件,然后再尝试依次去加载~/.bash_profile
、~/.bash_login
、~/.profile
,这三个配置文件之一,只要找到其中一个就不会接着寻找
- 这种方式会使用Bash的
- 通过ssh直接远程执行脚本和命令
- 这种方式会使用Bash的
non-interactive + non-login shell
模式,这会创建一个shell,等执行完脚本之后便会直接退出,不需要与用户交互。 - 这种模式下的bash不会去执行
/etc/profile
文件,而会去用户的HOME目录检查~/.bashrc
并加载。 - Bash通过BASH_ENV环境变量来记录要加载的文件,默认情况下这个环境变量并没有设置。如果有指定文件,那么Shell会先去加载这个文件里面的内容,然后再开始执行Shell脚本。
- 这种方式会使用Bash的
附:
解决方案:
解决SSH远程执行命令时找不到自定义环境变量的问题,可以在登录用户的HOME目录的
~/.bashrc
中添加需要的环境变量。
~/.bashrc
,在这个文件里面添加相关的环境变量,最后再source ~/.bashrc
通过ssh远程执行脚本和命令,里面遇到的找不到环境变量问题,也可以通过将你要写的环境变量写在
/etc/profile.d
这个文件夹底下,我这里是在地下,新建了一个叫bigdata_env.sh的bash文件,将要用的环境变量写在里面,最后再source /etc/profile
,现在再去执行脚本文件就不会再出现找不到相关的环境变量问题,如图:
脚本成功的截图
: