一、工具背景与使用场景
在日常的Linux服务器维护和项目部署中,我们经常会遇到需要在多个项目目录下执行相同或相似脚本的情况。例如:
-
微服务架构:当您有多个微服务项目(如api-esb、api-hos、api-smart)需要同时更新或重启时
-
批量部署:在开发、测试或生产环境中需要统一部署多个相关服务
-
定期维护:执行多个项目的日志清理、数据备份等维护任务
-
CI/CD流程:在自动化部署流程中批量触发构建脚本
本教程介绍的批量执行工具正是为解决这类重复性工作而设计,它可以一键执行指定目录下所有子文件夹中的release-dev.sh
脚本。
二、工具脚本详解
基础版脚本
bash
#!/bin/bash
# 定义基础目录
BASE_DIR="/home/tool/runjars"
# 检查基础目录是否存在
if [ ! -d "$BASE_DIR" ]; then
echo "错误:目录 $BASE_DIR 不存在"
exit 1
fi
# 查找所有包含 release-dev.sh 的子目录
find "$BASE_DIR" -name "release-dev.sh" | while read -r script_path; do
# 获取脚本所在目录
script_dir=$(dirname "$script_path")
echo "正在执行 $script_dir/release-dev.sh ..."
# 进入目录并执行脚本
(
cd "$script_dir" || exit
chmod +x release-dev.sh # 确保脚本有执行权限
./release-dev.sh
)
# 检查执行结果
if [ $? -eq 0 ]; then
echo "$script_dir/release-dev.sh 执行成功"
else
echo "$script_dir/release-dev.sh 执行失败"
fi
echo "----------------------------------------"
done
echo "所有 release-dev.sh 脚本执行完成"
增强版脚本(推荐)
bash
#!/bin/bash
# 定义基础目录和日志文件
BASE_DIR="/home/tool/runjars"
LOG_FILE="/var/log/release_dev_$(date +%Y%m%d_%H%M%S).log"
# 创建日志目录(如果不存在)
mkdir -p "$(dirname "$LOG_FILE")"
# 记录日志函数
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}
log "开始执行所有 release-dev.sh 脚本"
# 检查基础目录是否存在
if [ ! -d "$BASE_DIR" ]; then
log "错误:目录 $BASE_DIR 不存在"
exit 1
fi
# 查找所有包含 release-dev.sh 的子目录
find "$BASE_DIR" -name "release-dev.sh" | while read -r script_path; do
script_dir=$(dirname "$script_path")
script_name="$(basename "$script_dir")/release-dev.sh"
log "正在执行 $script_name ..."
# 进入目录并执行脚本
(
cd "$script_dir" || { log "无法进入目录 $script_dir"; exit 1; }
# 检查脚本是否存在且有执行权限
if [ ! -f "release-dev.sh" ]; then
log "错误:$script_name 不存在"
exit 1
fi
if [ ! -x "release-dev.sh" ]; then
chmod +x release-dev.sh || { log "无法添加执行权限给 $script_name"; exit 1; }
fi
# 执行脚本并捕获输出
./release-dev.sh >> "$LOG_FILE" 2>&1
)
# 检查执行结果
if [ $? -eq 0 ]; then
log "$script_name 执行成功"
else
log "$script_name 执行失败"
fi
done
log "所有 release-dev.sh 脚本执行完成"
log "详细日志请查看: $LOG_FILE"
三、使用方法
1. 安装与配置
-
使用文本编辑器创建脚本文件:
bashnano /usr/local/bin/run_all_release_dev.sh
-
将上述增强版脚本内容粘贴进去
-
保存并退出(Ctrl+O,Enter,Ctrl+X)
-
赋予执行权限:
bashchmod +x /usr/local/bin/run_all_release_dev.sh
2. 目录结构准备
确保您的目录结构如下:
/home/tool/runjars/
├── api-esb/
│ └── release-dev.sh
├── api-hos/
│ └── release-dev.sh
└── api-smart/
└── release-dev.sh
3. 执行脚本
bash
run_all_release_dev.sh
4. 查看执行结果
增强版脚本会自动生成日志文件,路径为:
bash
/var/log/release_dev_YYYYMMDD_HHMMSS.log
您可以使用以下命令查看最新日志:
bash
ls -t /var/log/release_dev_* | head -1 | xargs tail -f
四、高级配置选项
1. 自定义基础目录
修改脚本开头的BASE_DIR
变量:
bash
BASE_DIR="/path/to/your/directory"
2. 自定义日志路径
修改LOG_FILE
变量:
bash
LOG_FILE="/path/to/your/logfile.log"
3. 并行执行(适用于大量脚本)
使用GNU parallel工具加速执行:
bash
find "$BASE_DIR" -name "release-dev.sh" | parallel --jobs 4 'cd {//} && ./release-dev.sh'
五、实际应用案例
案例1:多项目一键重启
假设您有三个微服务项目需要同时重启:
-
在每个项目的
release-dev.sh
中编写重启逻辑:bash#!/bin/bash systemctl restart api-esb.service
-
执行批量脚本:
bashrun_all_release_dev.sh
案例2:批量代码更新与部署
-
release-dev.sh
内容:bash#!/bin/bash git pull origin master mvn clean package java -jar target/*.jar
-
一键执行所有项目更新
六、注意事项
-
权限问题:确保执行用户对目标目录和脚本有读写权限
-
脚本编码 :所有
release-dev.sh
脚本应为Unix格式(LF换行) -
执行顺序 :脚本是按查找顺序执行的,如需特定顺序,可在目录名前加数字如
01-api-esb
-
错误处理:单个脚本失败不会中断其他脚本执行
-
资源占用:同时执行多个脚本可能消耗大量资源,建议根据服务器性能调整
七、总结
这个批量执行工具脚本可以极大提高运维效率,特别适合管理多个相似项目的场景。通过增强版的日志记录和错误处理功能,您可以轻松追踪每个脚本的执行情况。根据实际需求,您可以进一步扩展脚本功能,如添加邮件通知、执行时间统计等高级特性。