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

使用go-task异步运行bash命令出现Bad file descriptor错误如何解决

问题根因

你遇到的报错是两个因素共同导致的:

  • go-task执行任务时,会为每个任务的进程组绑定专属的文件描述符、上下文生命周期,你在bash内联脚本中手动添加&把函数丢到后台执行时,后台子进程会继承主进程的文件描述符。当go-task判断主脚本执行完成、主动回收上下文和相关文件描述符后,还在运行的后台子进程调用jq时就会访问到已经被关闭的文件描述符,抛出bad file descriptor和context canceled错误。
  • 你当前的mergePackages函数存在资源竞争隐患:嵌套的jq子shell、管道调用会增加进程资源依赖链,高并发异步执行时,也可能出现管道读写端提前关闭、输入文件读写冲突的问题,这也是你不加&也偶发报错的原因。

修复方案

  • 优先使用go-task原生的并行能力替代bash手动异步:把当前遍历文件夹执行合并的逻辑拆成go-task的动态任务,配置run: parallel参数由go-task管控并行生命周期,避免手动后台执行导致的上下文回收异常。
  • 优化mergePackages函数的稳定性:
    • 给临时文件增加进程唯一标识,避免多进程冲突:
      TMP="$(mktemp /tmp/merge-packages.$$.XXXXXX)"
      
    • 合并嵌套的jq调用,减少子shell和管道依赖,降低资源竞争概率:
      jq -s '.[0].keywords + .[1].keywords | unique' "$1" "$2" > "$TMP.keywords"
      jq --slurpfile keywords "$TMP.keywords" -s -S '.[0] * .[1] | .keywords = $keywords[0]' "$1" "$2" > "$TMP"
      rm -f "$TMP.keywords"
      
    • 执行jq前增加输入文件校验,避免无效调用触发异常。
  • 临时适配方案:如果要保留bash手动异步逻辑,调用函数时重定向输入输出,避免继承主进程的文件描述符:
    mergePackages "./.common/package.hbs.json" "project-$SUBTYPE/package.hbs.json" "./.common-$SUBTYPE/package.hbs.json" > /dev/null 2>&1 &
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 21:45:05