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

Bash脚本wait命令未等待指定PID后台du进程完成的解决方案

问题根因

核心原因是后台启动的函数运行在独立子shell中,内部的变量修改无法同步回父shell:

  • 主脚本里用&把GetFileSpace函数放到后台运行时,每个函数实例都会fork出独立的子shell环境,和主脚本(父shell)的内存空间完全隔离
  • 函数内部往PIDS数组追加du进程PID的操作,只在当前子shell内部生效,主脚本里的PIDS数组从始至终都是空的
  • 后续遍历PIDS执行wait的循环因为数组没有元素,根本不会进入循环体执行等待逻辑,自然会直接跳到后续的格式化结果步骤。
修复方案

以下两种方案都能完全保留原有并行执行的效率,保证所有统计任务结束后再进入后续步骤,可根据自己的代码习惯选择:

方案1:分层等待(改动最小,保留原有函数后台启动逻辑)

逻辑调整为两层等待:主脚本只负责等待每个组的函数子进程,每个函数内部负责等待本组启动的所有du进程,从根本上避开子shell变量无法跨环境传递的问题。
修复后完整代码:

DIRECTORIES=( group1 group2 group3 group4 group5 )
PIDS=()

function GetFileSpace() {
    local group_pids=()
    shopt -s nullglob
    TARGETS=(/home/${1}/data/*)
    for ITEM in "${TARGETS[@]}"
    do
        du -hs "$ITEM" >> "./${1}_filespace.txt" &
        group_pids+=($!)
    done
    # 函数内部等待当前组所有du进程执行完成再退出
    wait "${group_pids[@]}"
}

for GROUP in "${DIRECTORIES[@]}"
do
    echo "$GROUP"
    GetFileSpace "$GROUP" 2>> "./${GROUP}_permission_denied.txt" &
    # 主脚本存储每个组函数子进程的PID
    PIDS+=($!)
done

# 主脚本等待所有组的任务全部执行完成
wait "${PIDS[@]}"

echo "Formatting Results..."

方案2:主进程直接收集所有du进程PID(逻辑更简单,无多层子shell)

去掉函数的后台启动逻辑,仅在函数内部把du任务放到后台运行,此时函数运行在主shell环境中,du进程的PID可以直接写入主脚本的PIDS数组,最后统一等待即可。
注意这个方案需要把权限错误的重定向从函数调用层移到du命令上,保证权限报错能正常写入日志。
修复后完整代码:

DIRECTORIES=( group1 group2 group3 group4 group5 )
PIDS=()

function GetFileSpace() {
    shopt -s nullglob
    TARGETS=(/home/${1}/data/*)
    for ITEM in "${TARGETS[@]}"
    do
        # 把错误重定向直接绑定到du命令
        du -hs "$ITEM" >> "./${1}_filespace.txt" 2>> "./${1}_permission_denied.txt" &
        PIDS+=($!)
    done
}

for GROUP in "${DIRECTORIES[@]}"
do
    echo "$GROUP"
    GetFileSpace "$GROUP"
done

# 等待所有du统计进程执行完成
wait "${PIDS[@]}"

echo "Formatting Results..."
额外注意事项
  • 所有路径、变量引用尽量加双引号,避免路径包含空格、特殊字符时命令执行异常
  • 直接用wait "${PIDS[@]}"就可以一次性等待数组内所有进程结束,不需要写循环逐个wait,效果完全一致,代码更简洁
  • 不要尝试通过修改变量作用域、export变量这类方式跨后台子shell传值,子shell的所有环境变更都是隔离的,进程退出后所有修改都会直接丢弃,这是Bash的原生机制,没有绕行空间。

内容的提问来源于stack exchange,提问作者Paul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 10:54:25