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

Bash脚本调用子脚本时tee命令卡住的问题求助

tee命令卡住问题排查

问题描述

我使用两个脚本script1和script2,在script1中调用script2,该子脚本会生成大量文本数据。我通过tee命令将这些文本重定向到文件,但tee命令出现卡住无法继续执行的情况。

执行script1.sh时,能看到Script End here输出,说明script2已成功执行完成,但script1却卡在tee命令处。当移除tee命令不捕获输出时,脚本可正常运行。

相关代码片段

script1.sh

# script1
# 执行一些任务
/bin/bash script2.sh 2>&1 | tee script2.log
capture=$(cat script2.log | grep "Successfully completed" | wc -l)
# 执行更多操作

script2.sh

#script2
# 执行部分代码
# 一些Python脚本
echo "Script End here"

系统及环境信息

# System details
$ uname -a
Linux jetson-nx-jetpack461 4.9.253-tegra #1 SMP PREEMPT Sat Feb 19 08:58:27 PST 2022 aarch64 aarch64 aarch64 GNU/Linux
# Bash version
$ bash --version
GNU bash, version 4.4.20(1)-release (aarch64-unknown-linux-gnu)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

疑问

有人遇到过类似问题吗?可能的原因是什么?

可能的原因及解决思路

  • 后台子进程未释放文件描述符:script2中的Python脚本可能启动了后台进程,这些进程没有关闭标准输出/错误的文件描述符,导致管道的写端一直处于打开状态,tee会持续等待数据输入,即使script2主进程已经退出。可以检查script2中是否有后台任务未正确终止,或者让Python脚本明确关闭输出流。
  • 缓冲区配置问题:当输出数据量极大时,默认的管道缓冲区可能导致阻塞。可以用stdbuf调整输出缓冲模式,强制行缓冲:
    stdbuf -oL -eL /bin/bash script2.sh 2>&1 | tee script2.log
    
  • 平台兼容性问题:在aarch64架构的Jetson平台上,tee命令可能存在特定环境下的兼容性bug。可以尝试用script命令替代tee来捕获输出:
    script -q -c "/bin/bash script2.sh" script2.log
    
  • IO或文件系统异常:检查script2.log所在磁盘的空间是否充足(df -h),以及当前用户是否有写入权限。磁盘IO异常也可能导致tee写入时卡住。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 12:24:19