如何并行运行函数并等待全部实例完成,同时维持加载动画?
问题描述
需要实现并行运行someFunction函数实例,准确感知所有实例何时全部完成,并让加载动画(spinner)持续到全部任务结束后停止。尝试的脚本如下:
for a in "${ARRAY[@]}"; do spin='/-\|' while true; do i=$(( (i+1) %4 )); printf "\r[ ${spin:$i:1} ] "; sleep .3; done & someFunction & kill $!; trap 'kill $!' SIGTERM done
但存在两个问题:
someFunction无法正常工作,推测是后台启动后被后续的kill $!立即终止- 脚本结束后,加载动画仍会在命令行持续运行
解决方案
核心思路是先批量启动所有后台任务并记录PID,再单独运行加载动画直到所有PID都退出,最后清理终端输出。
修正后的脚本
#!/bin/bash # 示例数组,替换为你的实际数据 ARRAY=("param1" "param2" "param3") # 存储后台进程PID的数组 PIDS=() # 1. 批量启动所有someFunction后台进程,记录每个进程的PID for a in "${ARRAY[@]}"; do # 启动函数并后台运行,将PID存入数组 someFunction "$a" & PIDS+=("$!") done # 2. 运行加载动画,直到所有后台进程完成 spin='/-\|' i=0 while true; do # 检查所有后台进程是否已全部退出 all_completed=true for pid in "${PIDS[@]}"; do # kill -0 仅检查进程是否存在,不发送终止信号 if kill -0 "$pid" 2>/dev/null; then all_completed=false break fi done # 所有任务完成则退出动画循环 if $all_completed; then break fi # 更新加载动画显示 printf "\r[ ${spin:$i:1} ] 正在处理,请稍候..." i=$(( (i+1) % 4 )) sleep 0.3 done # 3. 清理终端,显示完成提示 printf "\r[ ✅ ] 所有任务已全部完成!\n"
关键说明
- 避免误杀任务:先启动所有
someFunction后台进程并记录PID,不再在启动后立即杀死进程,确保任务能正常运行 - 动画监控逻辑:通过
kill -0检查每个PID的存活状态,只要有一个进程还在运行,动画就继续;全部进程退出后终止动画 - 终端清理:最后用
printf "\r"覆盖加载动画的行,输出完成提示,避免动画残留
内容的提问来源于stack exchange,提问作者faceless
相关产品推荐
相关产品推荐

