当前位置: 首页 > ai >正文

Linux中Java后端调用外部进程 未处理后台输出流 导致io阻塞问题解决方法

问题复现

项目中遇到通过Java后端调用启动CMake编译好的C++二进制文件,Websocket 客户端与服务端正常建立连接通信约两分钟后服务端会失联的问题,但如果本地启动C++进程通信是正常的。
在这里插入图片描述

问题原因

服务端启动C++进程的方法是通过:

ProcessBuilder pb = new ProcessBuilder("bash","-c","/home/ubuntu/cmake bin文件; exec bash");

然而ProcessBuilder如果只启动进程,但未处理输出流会造成io阻塞,因为没有正确处理外部进程(算法)的输出流,因此关于本地回环通信以及日志模块的功能都会受到影响。
在这里插入图片描述

  • ProcessBuilder(“./my_cpp_program”).start() 启动外部进程
  • 必须处理 process.getInputStream() 和 process.getErrorStream()
  • 否则C++进程的输出会阻塞,导致WebSocket子线程无法接收消息
  • 这是Unix/Linux系统的进程间通信机制决定的,不是Java或C++的bug

解决方法

方法一

直接丢弃输出流,防止有限缓冲区造成io阻塞

Process process = pb
// 丢弃stdout
.redirectOutput(ProcessBuilder.Redirect.DISCARD)//丢弃stderr
.redirectError(ProcessBuilder.Redirect.DISCARD).start();
方法二

使用Commons Exec进行外部进程管理
Commons Exec是为了简化 Java 应用中外部进程的调用和管理而设计的。它通过封装 Java 原生的 Process 和 Runtime,提供了更加友好和强大的API。这个库的设计重点是易用性和灵活性,让开发者可以更加专注于业务逻辑,而不是纠结于底层的进程管理细节。

http://www.xdnf.cn/news/18890.html

相关文章:

  • Mac训练大模型:MLX-LM框架LoRA训练Qwen3并集成SwanLab进行可视化
  • VMware + Ubuntu 桥接模式不能联网 的常见原因、排查思路和解决步骤
  • leetcode 3446. 按对角线进行矩阵排序 中等
  • 与trae携手,构建owtb一体化物流平台之--需求文档V0.3
  • 第五章:Go运行时、内存管理与性能优化之Go垃圾回收机制 (GC) 深入
  • UDS NRC24
  • AI智能农业监测系统深度解读:从大田作物管理到病虫害预警,破解传统农业增产难题
  • 终极实战 - 全链路排查一次“502 Bad Gateway”
  • 从用户视角出发:如何提升B端产品的操作效率?
  • 【第四章】BS 架构测试全解析:从功能验证到问题定位​
  • 使用 logging 模块生成 .log 文件
  • SMU算法与人工智能创新实践班SMU2025 Summer 7th 参考题解
  • npm install 安装离线包的方法
  • 光谱相机在雾霾监测中有何优势?
  • ABeam中国 | 中国汽车市场(5)——软件定义汽车(SDV)的智能化应用场景
  • MATLAB中的蛙跳算法实现
  • Android Glide插件化开发实战:模块化加载与自定义扩展
  • 从0开始搭建一个前端项目(vue + vite + typescript)
  • AI驱动企业数字化转型:解码未来三年的智能化变革密码
  • 深度学习④【经典卷积神经网络演进:从LeNet到ResNet(重要意义)的架构革命】
  • 【目标检测】论文阅读6
  • nvme ,文件系统、namespace、LBA,文件名的浅浅理解
  • 解决Visual Studio中UWP设计器无法显示的问题:需升级至Windows 11 24H2
  • SynClub-百度在海外推出的AI社交产品
  • Elasticsearch 启动反复重启排查实录:从“内存不足”到“vm.max\_map\_count 过小”
  • 力扣hot100:字母异位词分组和最长连续序列(49,128)
  • 【重学 MySQL】九十、Linux下MySQL的安装与卸载指南
  • Go 1.25新特性之容器感知功能详解
  • 嵌入式C语言进阶:位操作的艺术与实战
  • 8.27 网格memo