Linux批量执行工具脚本使用指南:一键运行多个release-dev.sh脚本

一、工具背景与使用场景

在日常的Linux服务器维护和项目部署中,我们经常会遇到需要在多个项目目录下执行相同或相似脚本的情况。例如:

  1. 微服务架构:当您有多个微服务项目(如api-esb、api-hos、api-smart)需要同时更新或重启时

  2. 批量部署:在开发、测试或生产环境中需要统一部署多个相关服务

  3. 定期维护:执行多个项目的日志清理、数据备份等维护任务

  4. 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. 安装与配置

  1. 使用文本编辑器创建脚本文件:

    bash 复制代码
    nano /usr/local/bin/run_all_release_dev.sh
  2. 将上述增强版脚本内容粘贴进去

  3. 保存并退出(Ctrl+O,Enter,Ctrl+X)

  4. 赋予执行权限:

    bash 复制代码
    chmod +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:多项目一键重启

假设您有三个微服务项目需要同时重启:

  1. 在每个项目的release-dev.sh中编写重启逻辑:

    bash 复制代码
    #!/bin/bash
    systemctl restart api-esb.service
  2. 执行批量脚本:

    bash 复制代码
    run_all_release_dev.sh

案例2:批量代码更新与部署

  1. release-dev.sh内容:

    bash 复制代码
    #!/bin/bash
    git pull origin master
    mvn clean package
    java -jar target/*.jar
  2. 一键执行所有项目更新

六、注意事项

  1. 权限问题:确保执行用户对目标目录和脚本有读写权限

  2. 脚本编码 :所有release-dev.sh脚本应为Unix格式(LF换行)

  3. 执行顺序 :脚本是按查找顺序执行的,如需特定顺序,可在目录名前加数字如01-api-esb

  4. 错误处理:单个脚本失败不会中断其他脚本执行

  5. 资源占用:同时执行多个脚本可能消耗大量资源,建议根据服务器性能调整

七、总结

这个批量执行工具脚本可以极大提高运维效率,特别适合管理多个相似项目的场景。通过增强版的日志记录和错误处理功能,您可以轻松追踪每个脚本的执行情况。根据实际需求,您可以进一步扩展脚本功能,如添加邮件通知、执行时间统计等高级特性。

相关推荐
HLC++5 小时前
Linux的进程间通信
android·linux·服务器
华清远见IT开放实验室6 小时前
实验室建设案例 | 石家庄科技信息职业学院嵌入式实验室——从底层硬件到系统应用,一所应用型高校的嵌入式人才培养这样落地
linux·arm开发·stm32·嵌入式硬件·高校·实验室建设
groundhappy8 小时前
idalib安装和codex ida-mcp配置
linux·开发语言·python
通信小小昕9 小时前
Ubuntu 26.04 中文输入法安装
linux·运维·ubuntu
张小姐的猫10 小时前
【Linux】网络编程 —— HTTP协议(上)
linux·运维·服务器·网络·http·单例模式·策略模式
栩栩云生11 小时前
AI 写代码犯的错,早被写进了错题集
linux·安全·ai编程
imc.1112 小时前
linux基础IO
linux·运维·服务器
BelongPanda14 小时前
Linux Nginx 纯手动 Let‘s Encrypt 泛域名证书配置教程
linux·nginx
酷可达拉斯14 小时前
Linux操作系统-shell编程(0)
linux·运维·服务器·python·云计算
2301_7779983414 小时前
Linux中断机制:操作系统如何高效运行
linux·运维·服务器