如何在Shell脚本中监控多个后台备份任务的单独运行状态?
监控Shell脚本后台任务完成状态的实现方案
先修正原代码的细节问题
原代码存在几处影响逻辑的小问题,需要先调整:
- 数组索引默认从0开始,原循环
(( arra=1; arra<=${#dbs[@]}; arra++ ))会跳过第一个元素 get_db_and_path函数中i变量未初始化,需提前赋值i=0paths变量名和数组名重复,会覆盖数组内容,建议改为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
相关产品推荐
相关产品推荐

