GNU Parallel收到SIGINT时丢失缓冲输出 如何保留有序输出定位卡住测试
解决方案
最简原生GNU Parallel适配方案
核心原理:GNU Parallel的-k参数仅会缓冲**标准输出(stdout)**用于保证输出顺序,标准错误(stderr)默认是实时透传、不受缓冲控制。我们只需要把测试启动的标识信息输出到stderr,即可在中断时直接定位到卡住的测试,完全不影响原有顺序输出逻辑。
修改后的命令如下:
find . -iname '*test*' | parallel -k -I@ 'echo running @ >&2; my_binary; echo @: exited with $?'
效果说明
- 原有标准输出的内容仍然遵循
-k的顺序要求,全部测试正常完成后会按输入顺序统一打印 - 每个测试启动时的
running 测试名会实时输出到终端,哪怕中途按下Ctrl+C终止,最后一行打印的running对应的测试就是陷入死循环的测试,不会被缓冲吃掉
同时保留所有已完成测试stdout的方案
如果需要在中断时也能看到所有已经完成的测试的完整输出,可以配合临时文件实现,完全保留顺序要求:
# 先按顺序保存所有测试文件列表,保证后续输出顺序和输入一致 TEST_LIST=$(find . -iname '*test*' | sort) # 并行执行测试,每个测试的stdout写入独立临时文件,启动日志输出到stderr实时查看 echo "$TEST_LIST" | parallel -k -I@ ' echo running @ >&2 { echo running @ my_binary echo @: exited with $? } > "@.test_tmp" ' # 所有测试正常完成后,按原始顺序合并输出所有临时文件并清理 for test_file in $TEST_LIST; do cat "$test_file.test_tmp" rm "$test_file.test_tmp" done
效果说明
- 正常执行完成后输出顺序和
-k要求完全一致 - 中途中断时,除了通过stderr最后一行定位卡住的测试,还可以直接查看所有
.test_tmp文件,获取已经完成的测试的完整输出
内容的提问来源于stack exchange,提问作者ChrisB
相关产品推荐
相关产品推荐

