You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何并行运行函数并等待全部实例完成,同时维持加载动画?

问题描述

需要实现并行运行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 00:20:14