Bash中使用&和wait实现并行处理的问题求助
问题分析与修复方案
你的脚本里wait命令失效,核心问题出在子shell变量隔离和进程同步逻辑上,我来一步步拆解:
为什么wait不生效?
- 子shell变量不共享:你在
DUMP里用RESTORE_CALLER &把每个恢复调用放到了独立的子shell中运行。current_restore_pid是在子shell里赋值的,其他子shell完全看不到这个值——甚至第一个调用RESTORE_CALLER时,current_restore_pid根本没初始化,wait ${current_restore_pid}等价于无参数的wait,会直接等待子shell自身的后台进程(但此时还没启动RESTORE,所以wait立刻返回)。 - 无进程间同步:循环里连续启动5个
RESTORE_CALLER后台进程,这些进程会同时运行,完全没做到“同一时间仅一个恢复”的要求。
修正后的脚本
我们需要把恢复进程的PID跟踪放到主shell中,让导出和恢复的串行逻辑在主进程里控制,避免子shell的变量隔离问题:
# 模拟恢复操作:这里替换成实际的restore命令 RESTORE() { echo "Starting restore (PID: $!)" sleep 10 # 模拟恢复耗时 echo "Restore done (PID: $!)" } # 模拟导出操作:这里替换成实际的dump命令 DUMP_TABLE() { local table_num=$1 echo "Dumping table $table_num..." sleep 2 # 模拟导出耗时 echo "Dump table $table_num completed" } # 主逻辑:逐个导出,导出完成后启动恢复,等待恢复完成再继续 MAIN() { local current_restore_pid for ((i=0; i<5; i++)); do # 1. 执行当前表的导出(串行执行,逐个完成) DUMP_TABLE $i # 2. 启动恢复操作,并记录PID RESTORE & current_restore_pid=$! # 3. 等待当前恢复完成,再进行下一轮 echo "Waiting for restore (PID: $current_restore_pid) to finish..." wait $current_restore_pid echo "--------------------------------------------------" done } # 启动主逻辑 MAIN
关键改进点
- 主shell管理PID:
current_restore_pid在主shell中赋值和跟踪,所有循环迭代都能共享这个变量,wait命令能准确等待指定的恢复进程。 - 串行执行逻辑:导出操作逐个完成,每个导出完成后才启动恢复,且必须等恢复完成才进入下一轮,完全满足“同一时间仅一个恢复”的要求。
- 模块化拆分:把导出和恢复拆成独立的函数,更易维护,也方便替换成实际的
mysqldump/mysql(或你用的数据库工具)命令。
如果需要导出并行但恢复串行?
如果你想让导出操作并行,但恢复必须串行(比如导出不怎么占资源,恢复占资源),可以用一个后台队列来处理恢复:
RESTORE_QUEUE() { while read -r dump_result; do echo "Starting restore for: $dump_result" sleep 10 echo "Restore done for: $dump_result" done } DUMP_TABLE() { local table_num=$1 echo "Dumping table $table_num..." sleep 2 echo "Table $table_num dumped" echo "$table_num" # 把导出结果传给恢复队列 } MAIN() { # 启动恢复队列(后台运行,串行处理任务) RESTORE_QUEUE & local queue_pid=$! # 并行导出所有表,结果传给恢复队列 for ((i=0; i<5; i++)); do DUMP_TABLE $i >&3 & done # 关闭管道,等待所有导出和恢复完成 wait kill $queue_pid 2>/dev/null } # 打开文件描述符3,连接到恢复队列的stdin exec 3> >(RESTORE_QUEUE) MAIN
这个版本里,导出可以并行执行,但恢复队列会逐个处理每个导出后的恢复请求,保证同一时间只有一个恢复在运行。
内容的提问来源于stack exchange,提问作者Amar C
相关产品推荐
相关产品推荐

