You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Shell脚本中监控多个后台备份任务的单独运行状态?

监控Shell脚本后台任务完成状态的实现方案

先修正原代码的细节问题

原代码存在几处影响逻辑的小问题,需要先调整:

  • 数组索引默认从0开始,原循环(( arra=1; arra<=${#dbs[@]}; arra++ ))会跳过第一个元素
  • get_db_and_path函数中i变量未初始化,需提前赋值i=0
  • paths变量名和数组名重复,会覆盖数组内容,建议改为current_paths

完整实现代码

# 定义数据库与备份路径映射
DB_AND_BKP_PATH='DB1:/backups/db1/dump1,/backups/db1/dump2,/backups/db1/dump3,/backups/db1/dump4
                 DB2:/backups/db2/dump1,/backups/db2/dump2,/backups/db2/dump3,/backups/db2/dump4
                 DB3:/backups/db3/dump1,/backups/db3/dump2,/backups/db3/dump3,/backups/db3/dump4'

# 初始化数组与计数器
declare -a dbs paths pids
i=0

# 拆分数据库与路径到数组的函数
function get_db_and_path(){
  for line in ${DB_AND_BKP_PATH}
  do
    IFS=':' read -r db path <<< "$line"
    dbs[$i]="$db"
    paths[$i]="$path"
    (( i++ ))
  done
}

# 调用函数填充数组
get_db_and_path

# 启动后台备份任务并记录PID与对应数据库
declare -a running_pids
for (( idx=0; idx<${#dbs[@]}; idx++ ))
do
  db=${dbs[$idx]}
  current_paths=${paths[$idx]}
  # 此处替换为你的真实backup函数,下方为模拟示例
  backup() {
    echo "启动${db}的备份任务,目标路径:${current_paths}"
    sleep $((RANDOM%10+5)) # 模拟随机时长的备份过程
    echo "${db}备份任务执行完成"
  }
  backup "${db}" "${current_paths}" &
  pids[$idx]="$!:${db}"
  running_pids[$idx]=1 # 标记任务为运行中
done

# 后台任务监控循环
echo "开始监控${#dbs[@]}个备份任务..."
while true; do
  # 标记是否所有任务已完成
  all_done=1
  for (( idx=0; idx<${#pids[@]}; idx++ ))
  do
    if [[ ${running_pids[$idx]} -eq 1 ]]; then
      all_done=0
      # 拆分PID与数据库名称
      IFS=':' read -r pid db <<< "${pids[$idx]}"
      # 检查进程是否存活(kill -0仅验证进程存在,不发送信号)
      if ! kill -0 "$pid" 2>/dev/null; then
        echo "Process ${db} is complete!"
        running_pids[$idx]=0 # 标记任务为已完成
      fi
    fi
  done

  # 输出当前仍在运行的任务
  echo -n "当前运行中任务:"
  for (( idx=0; idx<${#pids[@]}; idx++ ))
  do
    if [[ ${running_pids[$idx]} -eq 1 ]]; then
      IFS=':' read -r pid db <<< "${pids[$idx]}"
      echo -n "${db} "
    fi
  done
  echo ""

  # 所有任务完成则退出循环
  if [[ $all_done -eq 1 ]]; then
    echo "所有备份任务已完成!"
    break
  fi

  # 每隔2秒检查一次,可根据需求调整间隔
  sleep 2
done

核心逻辑说明

  • 进程存活验证:用kill -0 $pid判断进程是否存在,错误输出重定向到/dev/null避免冗余信息
  • 状态跟踪数组:running_pids数组记录每个任务的运行状态,防止重复输出完成提示
  • 实时状态展示:每次循环输出当前运行中的任务,直观掌握进度
  • 退出条件:当所有任务标记为已完成时,终止监控循环

内容的提问来源于stack exchange,提问作者Jorge L. Rodriguez Garcia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 02:33:13