#!/bin/bash# 配置部分 ############################################################## Zipkin JAR 文件的名称
# 这里指定了 Zipkin 的可执行 JAR 文件,确保该文件在当前目录中可用。
ZIPKIN_JAR="zipkin-server-2.23.2-exec.jar"# PID 文件的位置
# 该文件用于存储运行中 Zipkin 进程的 PID (Process ID)。用于后续检查进程是否在运行,或停止它。
ZIPKIN_PID_FILE="zipkin.pid"# 日志文件的位置
# Zipkin 的日志输出将被重定向到此文件中。
ZIPKIN_LOG_FILE="zipkin.log"# MySQL 配置 ############################################################## Zipkin 的存储类型,指定为 MySQL
STORAGE_TYPE="mysql"# MySQL 数据库的连接主机,使用阿里云的 MySQL RDS 地址
MYSQL_HOST="rm-xx.mysql.rds.aliyuncs.com"# MySQL 数据库的用户名
MYSQL_USER="root"# MySQL 数据库的密码
MYSQL_PASS="123456"# MySQL 数据库的名称
MYSQL_DB="zipkin"# 启动 Zipkin 的命令 #####################################################
# 指定时区 Asia/Shanghai 及使用 MySQL 存储
# 该函数用于启动 Zipkin,使用指定的存储设置 (MySQL) 和时区 (Asia/Shanghai)。
start_zipkin() {# 使用 nohup 命令后台启动 Zipkin,避免其受到终端关闭的影响。# -Duser.timezone=Asia/Shanghai 用于指定 Zipkin 进程的时区为中国标准时间 (UTC+8)。nohup java -Duser.timezone=Asia/Shanghai -jar $ZIPKIN_JAR \--STORAGE_TYPE=$STORAGE_TYPE \--MYSQL_HOST=$MYSQL_HOST \--MYSQL_USER=$MYSQL_USER \--MYSQL_PASS=$MYSQL_PASS \--MYSQL_DB=$MYSQL_DB \> $ZIPKIN_LOG_FILE 2>&1 &# 获取启动的进程 ID,并存入 PID 文件# 使用 `$!` 获取最后一个后台进程的 PID,并将其写入到 PID 文件中,以便后续使用。echo $! > $ZIPKIN_PID_FILEecho "Zipkin started with PID $(cat $ZIPKIN_PID_FILE)"
}# 停止 Zipkin 的命令 #####################################################
# 该函数用于停止运行中的 Zipkin 进程。
stop_zipkin() {# 检查 PID 文件是否存在,确保 Zipkin 进程正在运行if [ -f "$ZIPKIN_PID_FILE" ]; then# 读取 PID 文件中的进程 IDPID=$(cat $ZIPKIN_PID_FILE)# 检查该进程是否正在运行if ps -p $PID > /dev/null 2>&1; thenecho "Stopping Zipkin (PID: $PID)..."# 尝试正常停止进程kill $PIDsleep 5 # 等待 5 秒钟,确保进程有时间正常停止# 再次检查进程是否仍在运行if ps -p $PID > /dev/null 2>&1; thenecho "Failed to stop Zipkin. Force killing it..."# 如果进程未停止,则强制终止进程kill -9 $PIDfi# 删除 PID 文件,表示 Zipkin 已停止rm -f $ZIPKIN_PID_FILEecho "Zipkin stopped."elseecho "Zipkin is not running, but PID file exists. Cleaning up..."# 如果进程不存在但 PID 文件存在,清理无效的 PID 文件rm -f $ZIPKIN_PID_FILEfielseecho "No PID file found. Zipkin may not be running."fi
}# 检查 Zipkin 是否在运行 ##################################################
# 该函数用于检查 Zipkin 是否正在运行。
is_running() {# 检查 PID 文件是否存在if [ -f "$ZIPKIN_PID_FILE" ]; then# 读取 PID 文件中的进程 IDPID=$(cat $ZIPKIN_PID_FILE)# 检查该进程是否正在运行if ps -p $PID > /dev/null 2>&1; thenreturn 0 # 返回 0 表示进程正在运行elsereturn 1 # 返回 1 表示 PID 文件存在但进程不在运行fielsereturn 1 # 返回 1 表示没有 PID 文件,认为 Zipkin 未运行fi
}# 主逻辑 #################################################################
# 该部分是脚本的主逻辑,控制 Zipkin 的启动和停止操作。# 首先检查 Zipkin 是否在运行
if is_running; then# 如果 Zipkin 正在运行,先停止它echo "Zipkin is already running. Stopping it first..."stop_zipkin
fi# 启动 Zipkin
echo "Starting Zipkin..."
start_zipkin
脚本说明
1. 配置部分
ZIPKIN_JAR:指定Zipkin的可执行JAR文件,确保该文件在当前工作目录中存在。ZIPKIN_PID_FILE:存储Zipkin进程的PID,用于停止或检查进程是否在运行。ZIPKIN_LOG_FILE:指定Zipkin运行日志的输出文件路径。STORAGE_TYPE、MYSQL_HOST、MYSQL_USER、MYSQL_PASS、MYSQL_DB:用于配置Zipkin的存储后端为MySQL,并提供连接信息。
2. 启动 Zipkin (start_zipkin 函数)
- 该函数用于启动
Zipkin,并将其日志输出到指定的日志文件中,同时将进程的PID存储到PID文件中。- 通过
-Duser.timezone=Asia/Shanghai,指定了Zipkin运行的时区为Asia/Shanghai(中国标准时间,UTC+8)。- 使用
nohup命令确保Zipkin在后台运行,即使终端关闭也不会影响Zipkin的运行。
3. 停止 Zipkin (stop_zipkin 函数)
- 该函数用于停止
Zipkin进程。- 它首先检查
PID文件是否存在,如果存在则读取PID并检查进程是否在运行。- 如果进程正在运行,首先尝试正常停止它。如果在 5 秒内未能停止进程,则使用
kill -9强制终止进程。- 完成后,删除
PID文件。
4. 检查 Zipkin 是否在运行 (is_running 函数)
- 该函数通过检查
PID文件是否存在,并验证PID对应的进程是否在运行,来判断Zipkin是否正在运行。- 如果进程正在运行,返回
0;否则返回1。
5. 主逻辑
- 主逻辑首先调用
is_running函数,检查Zipkin是否在运行。- 如果
Zipkin正在运行,先调用stop_zipkin函数停止它。- 最后调用
start_zipkin函数启动Zipkin。
使用说明
-
保存脚本:
将上面的脚本保存为zipkin_control.sh,并赋予可执行权限:chmod +x zipkin_control.sh -
启动或重启 Zipkin:
运行脚本时,它会先检查Zipkin是否正在运行。如果正在运行,则停止它,然后重新启动。
./zipkin_control.sh
-
日志查看:
你可以通过查看zipkin.log文件来监控Zipkin的输出日志:tail -f zipkin.log
总结
- 该脚本自动处理
Zipkin的启动和停止操作,并记录日志和进程信息。 - 通过使用
PID文件,可以确保脚本能正确识别并管理Zipkin进程。 - 通过
-Duser.timezone参数,设置了Zipkin的时区,确保日志输出符合指定时区。 - 启动成功查看地址:http://127.0.0.1:9411/ 服务器ip+ 默认端口9411
- 查询启动情况 ps aux | grep zipkin