必须加 wait 才能确保所有后台任务完成后再执行汇总,否则脚本会立即继续导致读取失败;wait 默认等待所有子进程,但需额外检查各任务退出状态并用独立日志避免竞态。

用 wait 命令就能确保所有后台任务跑完再执行汇总,这是 Shell 并行控制中最关键也最常被忽略的一环。
必须加 wait 才能等全部结束
Shell 不会自动等待后台任务(用 & 启动的)完成。不加 wait 的话,脚本会立刻往下走,哪怕任务还在 sleep 或传输中——这时汇总往往读不到结果,甚至报错“文件不存在”。
- 只要用了 & 启动了后台任务,最终汇总前就必须写
wait -
wait默认等待当前 shell 启动的所有子进程,无需额外参数 - 它会阻塞直到最后一个后台任务退出,然后才继续执行下一行
汇总前先检查每个任务是否成功
wait 只保证“都结束了”,不保证“都成功了”。所以汇总逻辑里得逐个判断退出状态。
- 推荐为每个任务单独记录日志和状态码,比如:
echo "status: $?" >> task1.log - 汇总时用
tail -n 1 task1.log | grep -oP 'status: \K\d+'提取状态 - 状态为 0 表示成功,非 0 就要标记失败或触发告警
避免汇总阶段出现竞态问题
多个后台任务可能同时往同一个文件追加内容,导致输出错乱或覆盖。
- 不要让所有任务直接
>> summary.txt—— 这是不安全的 - 改用独立日志文件(如
task1.out),汇总时再按需读取、合并 - 如果必须实时写总表,可用
flock加锁,但通常没必要,分离日志更简单可靠
一个干净的收尾结构
不管前面怎么并发,最后三步要清晰:
- 所有任务用
&启动后,紧接一行wait - 再用循环遍历各日志,提取状态、分类统计、生成报告
- 最后清理临时资源(如 fifo 文件、空目录),保持环境干净











