pids=()
for u in "${urls[@]}"; do curl -fsS "$u" & pids+=($!); done
for p in "${pids[@]}"; do wait "$p" || rc=1; done
批量刷新 CDN 的脚本用 & 起了 8 个 curl,脚本 2 秒就结束退出码 0,实际请求还在跑,父进程没了之后一半连接被重置,刷新成功率只有 62%。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,脚本没有 wait 就退出,后台子进程被 init 接管,脚本的退出码也不代表子任务的结果。定时任务看到 0 就认为成功。
这次卡住的地方就在「后台任务未 wait」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。
接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。
处理上按这个顺序:所有后台任务起完后统一 wait 收集各自的退出码;用 wait -n 配合计数控制并发度;任一子任务失败就让整体返回非 0;对比脚本退出时 curl 的成功数是否已经落盘。
改完只确认一件事:脚本退出时 8 个请求都已结束,成功数写进汇总文件,失败会返回非 0。
