【问题与解决】Kafka群起时报错:kafka-run-class.sh: line 258: exec: java: not found的解决办法

一、问题描述

  • 在学习使用Kafka时,为了方便,写了一个群里脚本,用于同时启动所有虚拟机端的Kafka,群起的脚本如下:
#!/bin/bash

case $1 in
"start"){
        for i in hadoop02 hadoop03 hadoop04
        do
                echo "**********$i starting...**********"
                ssh $i '/opt/module/kafka_2.11-0.11.0.0/bin/kafka-server-start.sh -daemon /opt/module/kafka_2.11-0.11.0.0/config/server.properties'
        done
};;
"stop"){
        for i in hadoop02 hadoop03 hadoop04
        do
                echo "**********$i stoping...**********"
                ssh $i "/opt/module/kafka_2.11-0.11.0.0/bin/kafka-server-stop.sh"
        done
};;
esac
  • 但是在执行后,发现Kafka并没有被启动,也没有日志信息或日志文件。因此我将上述代码中start部分的-daemon删除,关闭其静默启动,再次启动Kafka,观察输出结果,得到的结果如下图所示。
    报错显示
  • 可以看到,报出的错误如下:
/opt/module/kafka_2.11-0.11.0.0/bin/kafka-run-class.sh: line 258: exec: java: not found

二、原因分析

  • 该错误的字面意思是:在kafka-run-class.sh脚本文件中的第258行处执行时,找不到“java”字符串的含义。
  • 经过仔细排查,已确定不是脚本输入错误或是安装出错的问题。
  • 于是,我打开了这个脚本,查看其源代码,找到第258行。
  • 由于报错的原因主要和“java”有关,所以查找标注出“java”字符串
    kafka-run-class.sh脚本源代码
  • 在第258行,可以看到有$JAVA变量,猜测是这个变量出了问题,于是向前查找该变量。果不其然,在前文中找到该变量定义的位置,如下图所示。
    JAVA变量的定义代码
  • 可以看到,这是指定系统使用java的地方,于是想到与JAVA_HOME环境变量的配置有关。
  • 由于交互式shell和非交互式shell、登录shell和非登录shell是有区别的。
  • 在登录shell里,环境信息需要读取/etc/profile和~ /.bash_profile, ~/.bash_login, and ~/.profile按顺序最先的一个,并执行其中的命令。除非被 —noprofile选项禁止了;
  • 在非登录shell里,环境信息只读取 /etc/bash.bashrc和~/.bashrc 手工执行是属于登录shell,脚本执行数据非登录shell,而我的linux环境配置中只对/etc/profile进行了jdk1.8等环境的配置,所以脚本执行启动Kafka失败了
    本机Java Home的输出

三、解决办法

  • 直接在源代码中显式指定JAVA_HOME的路径(注意要根据自己系统中的路径进行更改,不要直接照抄),如下图所示。
    修正代码
  • 修改完成后,:wq保存退出。然后在群起脚本中加回-daemon指令,静默启动。可以看到启动结果如下
    启动结果
  • 可见,此时Kafka已经正常启动,照此方法修改其它主机的配置信息即可,问题得到解决。

有用的话记得点个赞哦~

  • 13
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MomentNi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值