使用&并行执行多条终端命令时如何得到有序不混杂的输出结果
并行执行命令且避免输出混杂的解决方案
方案1:重定向单条命令输出到临时文件,最后按序合并
这是实现成本最低、稳定性最高的方案,完全保留&并行的执行速度:
- 先创建临时目录存储单条命令的输出:
mkdir -p /tmp/cmd_outputs - 遍历待执行命令,按序号分配独立输出文件,后台并行执行:
# 假设所有待执行命令按顺序存放在cmds.txt中,每行一条 count=1 while IFS= read -r cmd; do # 后台执行命令,标准输出、错误输出都写入对应序号的临时文件 eval "$cmd" > /tmp/cmd_outputs/output_${count}.json 2>&1 & count=$((count+1)) done < cmds.txt # 等待所有后台进程执行完毕 wait # 按命令原始顺序合并所有输出,得到有序结果 for i in $(seq 1 $((count-1))); do cat /tmp/cmd_outputs/output_${i}.json # 如果你需要生成合法JSON数组,这里可以加一句 echo "," 分隔,最后在外层补[]即可 done > all_results.json # 执行完成后可按需清理临时目录 # rm -rf /tmp/cmd_outputs
- 优势:所有输出完全隔离不会混杂,最终结果顺序和命令提交顺序完全一致,执行速度和直接用&并行无差异。
方案2:用命名管道(FIFO)实现无磁盘写入的高速有序输出
如果对性能要求极高,不想产生临时磁盘文件,可以用命名管道实现内存级别的输出隔离:
mkdir -p /tmp/fifo_dir count=0 # 先为每条命令创建对应的命名管道 while IFS= read -r cmd; do count=$((count+1)) mkfifo /tmp/fifo_dir/fifo_${count} done < cmds.txt # 后台并行执行所有命令,输出写入对应FIFO count=0 while IFS= read -r cmd; do count=$((count+1)) eval "$cmd" > /tmp/fifo_dir/fifo_${count} 2>&1 & done < cmds.txt # 按顺序读取FIFO内容,输出到结果文件 for i in $(seq 1 ${count}); do cat /tmp/fifo_dir/fifo_${i} rm /tmp/fifo_dir/fifo_${i} done > all_results.json rmdir /tmp/fifo_dir
补充:优化parallel执行速度的方法
你之前用parallel速度慢大概率是没有调整并行度参数,parallel默认并行数等于CPU核心数,如果你执行的是IO密集型命令(比如网络请求、轻量文件读写),可以手动调高并行度,性能和直接用&基本一致:parallel -j 200 < cmds.txt > all_results.json
其中-j后的数字可以根据你的业务场景调整,最高可以设为和命令总数相等。
内容的提问来源于stack exchange,提问作者roukrak
相关产品推荐
相关产品推荐

