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
相关产品推荐
相关产品推荐

