一次解决Docker内java变量原因导致执行Kafka查询消费报错经历

  引言

  企业内对某设备小集群进行状态巡检(包括内存、磁盘、CPU、集群状态、集群Docker内接口状态、服务状态、Kafka消费情况监控)。

  由于需要将状态的结果通过命令展示在命令行中,且查询命令较多,于是打算脚本解决。在写脚本时,查询内容包括了宿主机和docker内的服务都需要查询,脚本是通过内外联动的方式,前面查询都正常,在执行到Kafka消费时报错。以下是脚本内容:

  宿主机:

#!/bin/bash
#制作人QQ:763342488
#查询系统状态
echo -e  "\033[1;5;4;47;32m 查询系统状态 \033[0m"
sleep 5 #休眠五秒
echo -e  "\033[1;5;4;47;31m 磁盘状态 \033[0m"
df -h
sleep 2 #休眠两秒
echo -e  "\033[1;5;4;47;31m 内存状态 \033[0m"
free -h
sleep 2 #休眠两秒
echo -e  "\033[1;5;4;47;31m 系统活动报告 \033[0m"
sar -u 1 2
sleep 2 #休眠两秒

#查询*集群健康值及集群关系
echo -e  "\033[1;5;4;47;32m 查询* \033[0m"
sleep 2 #休眠两秒
echo -e  "\033[1;5;4;47;31m 节点与主机 \033[0m"
curl 0.0.0.0:9200/_cat/nodes
sleep 2 #休眠两秒
echo -e  "\033[1;5;4;47;31m 健康状态 \033[0m"
curl 0.0.0.0:9200/_cluster/health?pretty
sleep 2 #休眠两秒

  Docker内:(服务以及路劲保密,使用星号代替了)

#!/bin/bash
#查询接口状态用脚本
#制作人QQ:763342488
echo -e  "\033[1;5;4;47;32m 查询接口状态用脚本,开始运行!!! \033[0m"
sleep 5 #休眠五秒

echo -e  "\033[1;5;4;47;31m * \033[0m"
tail -n 30  /*/`date +"%Y-%m-%d"`.log |grep ftp
sleep 2 #休眠两秒

echo -e  "\033[1;5;4;47;31m * \033[0m"
tail  -n 30 /*/`date +"%Y-%m-%d"`.log |grep sftp
sleep 2 #休眠两秒

echo -e  "\033[1;5;4;47;31m * \033[0m"
tail  -n 30 /*/`date +"%Y-%m-%d"`.log |grep https
sleep 2 #休眠两秒

echo -e  "\033[1;5;4;47;31m * \033[0m"
tail  -n 30  /*/`date +"%Y-%m-%d"`.log |grep sftp

#查询服务状态用脚本
echo -e  "\033[1;5;4;47;32m 查询服务状态用脚本,开始运行!!! \033[0m"
sleep 5 #休眠五秒

echo -e  "\033[1;5;4;47;31m * \033[0m"
systemctl status *.service #*
sleep 2 #休眠两秒

echo -e  "\033[1;5;4;47;31m * \033[0m"
systemctl status *.service #*
sleep 2 #休眠两秒

echo -e  "\033[1;5;4;47;31m * \033[0m"
systemctl status *.service #*
sleep 2 #休眠两秒

echo -e  "\033[1;5;4;47;31m * \033[0m"
systemctl status *.service #*
sleep 2 #休眠两秒

echo -e  "\033[1;5;4;47;31m * \033[0m"
systemctl status * #*
sleep 2 #休眠两秒

echo -e  "\033[1;5;4;47;31m * \033[0m"
systemctl status * #*
sleep 2 #休眠两秒

echo -e  "\033[1;5;4;47;31m * \033[0m"
systemctl status *.service #*
sleep 2 #休眠两秒

echo -e "\033[1;5;4;47;32m kafka消费情况 \033[0m"
echo -e "\033[1;5;4;47;31m `date +"%Y-%m-%d"` \033[0m"
sleep 2 #休眠两秒
/usr/local/kafka/bin/kafka-consumer-groups.sh --describe --bootstrap-server localhost:9092 --group toptcm-syslog-es

echo -e "\033[1;5;4;47;32m * \033[0m"
sleep 2 #休眠两秒
echo -e "\033[1;5;4;47;31m `date +"%Y-%m-%d"` \033[0m"
ls /*/`date +"%Y%m%d"`/*/

echo -e  "\033[1;5;4;47;32m 脚本运行完成,感谢使用~~~ \033[0m"

  效率:  

  在写脚本的时候,无非就是将大量查询命令堆积一起,并且设置格式和字体,让巡检的时候能提高工作效率(摸鱼)而已。两个脚本单独放在宿主机和docker内执行都是正常的,但是里面执行一次,外面执行一次多麻烦啊,想着把内外联动下,只输入一次执行脚本的命令就能内外都查询。于是就在宿主机脚本最下面加了一行。

#docker内
docker exec -it *-server /bin/bash /opt/system.sh

  报错: 

  让宿主机的内容执行完了之后,直接进docker执行里面的脚本,执行到kafka的时候报错如下:

   检查了宿主机与Docker内的java环境变量,都是一样的,但在宿主机执行docker内脚本的时候,并不会正确调用java。

.......跳过繁琐的排查过程直接说结果,执行kafka命令前读取一下docker内的环境变量再执行就行了,这条这么写:

  结果:

echo -e "\033[1;5;4;47;32m kafka消费情况 \033[0m"
echo -e "\033[1;5;4;47;31m `date +"%Y-%m-%d"` \033[0m"
sleep 2 #休眠两秒
source /etc/profile
/usr/local/kafka/bin/kafka-consumer-groups.sh --describe --bootstrap-server localhost:9092 --group toptcm-syslog-es

/etc/profile内有java的路劲,source一下路劲再执行查询内容即可。

 

posted @ 2024-03-11 15:07  离愁落雨  阅读(11)  评论(0编辑  收藏  举报