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. 资源占用:同时执行多个脚本可能消耗大量资源,建议根据服务器性能调整

七、总结

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

相关推荐
小白跃升坊4 小时前
基于1Panel的AI运维
linux·运维·人工智能·ai大模型·教学·ai agent
跃渊Yuey5 小时前
【Linux】线程同步与互斥
linux·笔记
舰长1155 小时前
linux 实现文件共享的实现方式比较
linux·服务器·网络
zmjjdank1ng5 小时前
Linux 输出重定向
linux·运维
路由侠内网穿透.5 小时前
本地部署智能家居集成解决方案 ESPHome 并实现外部访问( Linux 版本)
linux·运维·服务器·网络协议·智能家居
VekiSon5 小时前
Linux内核驱动——基础概念与开发环境搭建
linux·运维·服务器·c语言·arm开发
zl_dfq6 小时前
Linux 之 【进程信号】(signal、kill、raise、abort、alarm、Core Dump核心转储机制)
linux
Ankie Wan6 小时前
cgroup(Control Group)是 Linux 内核提供的一种机制,用来“控制、限制、隔离、统计”进程对系统资源的使用。
linux·容器·cgroup·lxc
skywalk81636 小时前
尝试在openi启智社区的dcu环境安装ollama最新版0.15.2(失败)
linux·运维·服务器·ollama
zhengfei6117 小时前
AutoPentestX – Linux 自动化渗透测试和漏洞报告工具
linux·运维·自动化