-
JaCoCo Agent检查和拷贝:自动检查目标机器上是否存在jacocoagent.jar,如果不存在则从执行机拷贝过去
-
端口冲突检查:扫描目标机器上所有应用的vmoptions文件,检查已使用的JaCoCo端口,自动分配可用端口(从6300开始递增)
-
自动配置添加:在每个应用的vmoptions文件中添加JaCoCo参数,并自动备份原文件
-
批量部署:支持同时处理多个服务器
- 基本用法:
# 处理单个服务器
./deploy_jacoco.sh 192.168.1.10
# 处理多个服务器
./deploy_jacoco.sh 192.168.1.10 192.168.1.11 192.168.1.12- 指定应用:
# 只为特定应用添加配置
./deploy_jacoco.sh -a "app1,app2,app3" 192.168.1.10- 从文件读取服务器列表:
# 创建服务器列表文件
echo -e "192.168.1.10\n192.168.1.11\n192.168.1.12" > servers.txt
# 使用文件
./deploy_jacoco.sh -f servers.txt- 自定义配置:
# 自定义JaCoCo文件路径和起始端口
./deploy_jacoco.sh -j /path/to/jacocoagent.jar -p 7000 -u root 192.168.1.10- 预览模式:
# 仅显示将要执行的操作,不实际执行
./deploy_jacoco.sh --dry-run -a "app1,app2" 192.168.1.10- 智能端口分配:自动检查已使用端口,避免冲突
- 安全备份:修改vmoptions文件前自动备份
- 错误处理:完善的错误检查和处理机制
- 日志记录:详细的操作日志,便于跟踪和调试
- SSH支持:支持SSH密钥认证和自定义用户
- 预览模式:支持dry-run模式,预览操作而不实际执行
- 确保执行机上有jacocoagent.jar文件
- 配置好SSH免密登录到目标服务器
- 根据需要修改脚本中的路径配置
- 给脚本执行权限:
chmod +x deploy_jacoco.sh
仅仅检查vmoptions文件中的配置是不够的,还需要检查端口是否真的在系统层面被占用。加入了系统层面的端口占用检查。更新的主要改进包括:
-
多层端口检查:
- 检查vmoptions文件中已配置的JaCoCo端口
- 检查系统层面正在监听的端口(使用netstat/ss)
- 实时检查端口是否真的可用
-
兼容性处理:
- 优先使用
netstat命令 - 如果不存在则使用
ss命令 - 备用方案使用
/proc/net/tcp
- 优先使用
-
实时验证:
- 在分配端口前进行最终的可用性检查
- 避免因为缓存或其他原因导致的端口冲突
# 检查顺序:
1. 配置文件中是否已使用该端口
2. 系统netstat/ss显示该端口是否被监听
3. 实时尝试检查端口是否真的可用
4. 如果都通过,则认为端口可用get_system_used_ports(): 获取系统层面正在使用的端口is_port_available(): 实时检查特定端口是否可用get_next_available_port(): 综合检查找到下一个可用端口
运行时你会看到更详细的日志:
[2024-01-15 10:30:15] 服务器 192.168.1.10 配置文件中已使用的JaCoCo端口: 6300 6301
[2024-01-15 10:30:16] 服务器 192.168.1.10 系统层面正在使用的端口: 22 80 443 3306 6300
[2024-01-15 10:30:17] 端口 6300 已在配置文件中使用,尝试下一个端口
[2024-01-15 10:30:17] 端口 6301 已在配置文件中使用,尝试下一个端口
[2024-01-15 10:30:18] 找到可用端口: 6302
[2024-01-15 10:30:19] 成功为应用 app1 添加JaCoCo配置,端口: 6302这样可以确保分配的端口既不会与已有的JaCoCo配置冲突,也不会与系统中其他服务的端口冲突,大大提高了端口分配的可靠性。
# 查询单个应用在单个服务器上的端口
./deploy_jacoco.sh --query -a "app1" 192.168.1.10
# 查询多个应用在单个服务器上的端口
./deploy_jacoco.sh --query -a "app1,app2,app3" 192.168.1.10
# 查询单个应用在多个服务器上的端口
./deploy_jacoco.sh --query -a "app1" 192.168.1.10 192.168.1.11 192.168.1.12
# 使用服务器列表文件查询
./deploy_jacoco.sh --query -a "app1" -f servers.txt# 列出单个服务器上所有JaCoCo配置
./deploy_jacoco.sh --list 192.168.1.10
# 列出多个服务器上所有JaCoCo配置
./deploy_jacoco.sh --list 192.168.1.10 192.168.1.11
# 使用服务器列表文件
./deploy_jacoco.sh --list -f servers.txt========================================
服务器 应用名 端口 状态说明
========================================
192.168.1.10 app1 6300 端口占用
192.168.1.10 app2 6301 端口空闲
192.168.1.11 app1 6300 端口占用
192.168.1.11 app2 N/A (未配置)
========================================
服务器 192.168.1.10 JaCoCo配置:
----------------------------------------
应用名 端口 状态 完整配置
----------------------------------------
app1 6300 占用 -javaagent:/app/appsystem/apps/jacocoagent.jar=output=tcpserver,port=6300,address=0.0.0.0
app2 6301 空闲 -javaagent:/app/appsystem/apps/jacocoagent.jar=output=tcpserver,port=6301,address=0.0.0.0
----------------------------------------
query_jacoco_port(): 查询指定应用的JaCoCo端口list_all_jacoco_configs(): 列出服务器上所有JaCoCo配置query_mode(): 查询模式主函数,处理查询和列表逻辑
- 端口号: 显示实际配置的端口
- N/A (文件不存在): vmoptions文件不存在
- N/A (未配置): vmoptions文件存在但没有JaCoCo配置
- 端口占用: 端口正在被使用
- 端口空闲: 端口未被占用
现在你可以方便地查询任何应用在任何服务器上的JaCoCo端口配置了!