java 调用shell时出现假死问题

量化实战:用三种波动率模型给你的期货策略做个“体检”(附Python代码与螺纹钢案例) 本文深入探讨了三种专业波动率模型(Parkinson、Garman-Klass和Rogers-Satchell)在期货量化策略中的应用,并以螺纹钢期货为例,展示了如何通过Python实现这些模型进行多维度波动率分析。文章详细比较了不同模型的特点和适用场景,提供了动态仓位管理、止损策略优化等实战应用方案,帮助交易者更精准地评估市场风险,优化策略表现。 阅读详情

现象:在使用java 调用 shell 解压rar 文件,当文件数量较少时,没有任何问题.一旦文件数量超过500,就会出现卡死等问题.

	public static String exec(String cmd) {
		String result = "";
		try {
			String[] shellCmd = new String[] { "/bin/sh", "-c", cmd };
			Process ps = Runtime.getRuntime().exec(cmd);
			ps.waitFor();

			BufferedReader br = new BufferedReader(new InputStreamReader(
					ps.getInputStream()));
			StringBuffer sb = new StringBuffer();
			String line;
			while ((line = br.readLine()) != null) {
				sb.append(line).append("\n");
			}
			result = sb.toString();
			System.out.println(result);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}


以上是我最开始使用的代码.网上有很多的地方都是这样写的.

如果用来调用一些简单的shell ,的确不会有什么问题.一旦处理的文件过多,就不行了.

为什么呢?

其实主要的问题来源于waitfor()这块,

让我们来看看waitFor()的说明:


JDK帮助文档上这么说:如有必要,一直要等到由该 Process 对象表示的进程已经终止。如果已终止该子进程,此方法立即返回。但是直接调用这个方法会导致当前线程阻塞,直到退出子进程。对此JDK文档上还有如此解释:因为本地的系统对标准输入和输出所提供的缓冲池有效,所以错误的对标准输出快速的写入何从标准输入快速的读入都有可能造成子进程的所,甚至死锁。好了,问题的关键在缓冲区这个地方:可执行程序的标准输出比较多,而运行窗口的标准缓冲区不够大,所以发生阻塞。接着来分析缓冲区,哪来的这个东西,当Runtime对象调用exec(cmd)后,JVM会启动一个子进程,该进程会与JVM进程建立三个管道连接:标准输入,标准输出和标准错误流。假设该程序不断在向标准输出流和标准错误流写数据,而JVM不读取的话,当缓冲区满之后将无法继续写入数据,最终造成阻塞在waitfor()这里。 知道问题所在,我们解决问题就好办了。查看网上说的方法多数是开两个线程在waitfor()命令之前读出窗口的标准输出缓冲区和标准错误流的内容。


看代码

public class RmtShellExecutor {
	// 本地执行方法
	public static void execLocal(String cmd) {
		try {
			Process proc = Runtime.getRuntime().exec(cmd);
			GobblerThread errorGobbler = new GobblerThread(
					proc.getErrorStream(), "ERROR");
			GobblerThread outputGobbler = new GobblerThread(
					proc.getInputStream(), "OUTPUT");
			errorGobbler.start();
			outputGobbler.start();
			int exitVal = proc.waitFor();
			System.out.println("ExitValue: " + exitVal);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

public class GobblerThread extends Thread {
	InputStream is;
	String type;

	GobblerThread(InputStream is, String type) {
		this.is = is;
		this.type = type;
	}

	public void run() {
		try {
			InputStreamReader isr = new InputStreamReader(is);
			BufferedReader br = new BufferedReader(isr);
			String line = null;
			while ((line = br.readLine()) != null)
				System.out.println(line);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

再次调用,已经没有什么问题了,mark 一下,防止下次出现同样的问题.
qt项目中添加 jsoncpp 库 qt使用jsoncpp库 阅读详情

相关推荐

别再死磕公式了!用Python+NumPy手把手实现机器人逆运动学数值求解(附避坑指南)

本文详细介绍了如何使用Python和NumPy实现机器人逆运动学(Inverse Kinematics, IK)的数值求解方法,包括牛顿-拉弗森法、雅可比矩阵计算及奇异位形处理。通过实战代码和避坑指南,帮助开发者快速掌握现代机器人学中的核心算法,提升工程实践能力。

weixin_30687051的博客 127

Java调用Shell问题整理

背景java可以通过Runtime来调用其他进程,如cmd命令,shell文件或脚本等。基本用法Runtime执行时返回一个Process对象,利用该对象完成脚本执行。下面的例子中,Linux的/home/目录下有一个删除指定日期文件的脚本deletefile.sh,Java调用该脚本的方法如下。 /** * 删除指定日期的文件 * @param date yyyy-MM-dd...

本博客纯属个人网络笔记,如对阁下有用,甚喜;否则,关掉即可,不喜勿喷。专心写代码,不做键盘侠! 9493

Cursor AI编程工具保姆级安装指南:从下载到中文界面设置(含免费额度说明)

本文提供Cursor AI编程工具的保姆级安装与设置教程。详细指导从官网下载、安装到中文界面切换的每一步,并重点说明其每月500次高级模型调用的免费额度策略。通过个性化设置与核心插件推荐,帮助开发者快速上手,提升AI辅助编程效率。

weixin_29191761的博客 671

Shell: 一个奇怪的问题-Java调用shell脚本超时

直接执行改shell脚本是没问题的。 Java调用shell脚本,结果几秒后提示超时。 检查脚本,逐行注释,最终发现是某行中的more命令导致。 把more 换成cat,OK。 原因:猜测可能是more会自动分页显示导致,Java等待翻页,等不到,则超时。 https://www.cnblogs.com/lidabo/p/6196457.html ...

七侠镇莫小贝的同福客栈 528

Matlab Robotics Toolbox实战:四自由度机械臂建模与仿真全流程(附代码)

本文详细介绍了使用Matlab Robotics Toolbox进行四自由度机械臂建模与仿真的全流程,包括DH参数定义、模型构建、可视化、运动学仿真及交互控制。通过实战案例和代码示例,帮助读者快速掌握机械臂建模技巧,提升机器人学习效率。

weixin_42538752的博客 415

Flutter模块打包AAR集成Android原生项目实践

跨平台开发框架Flutter通过将UI组件渲染为原生代码实现高性能表现,其核心优势在于一套代码可同时运行在iOS和Android平台。在工程实践中,将Flutter模块打包为AAR(Android Archive)进行集成,成为混合开发的主流方案。这种方案既保留了原生项目的稳定性,又能渐进式引入Flutter的高效开发特性。通过配置MethodChannel实现原生与Dart代码通信,开发者可以灵活控制Flutter引擎生命周期,优化内存占用和渲染性能。对于电商、社交等需要快速迭代的业务场景,该方案能显著提

weixin_34025051的博客 398

java执行shell封装,解决java运行shell卡顿,堵塞问题

【代码】java执行shell封装,解决java运行shell卡顿,堵塞问题。

qq_46110497的博客 1079

告别手绘!用Aseprite+Unity Tilemap,从AI生成到2D游戏地图的保姆级搭建流程

本文详细介绍了如何利用Aseprite和Unity Tilemap从AI生成素材到搭建2D游戏地图的完整流程。涵盖AI生成素材的预处理、图层管理、动画制作,以及Unity中的Tilemap系统配置和性能优化技巧,帮助开发者高效创建像素风游戏地图。

weixin_29015483的博客 580

Java执行shell遇到的各种问题

1、基础介绍 Java执行shell需要用到Process类

曹海成的专栏 2万+

Splunk CVE-2018-11409认证绕过漏洞深度解析

Splunk作为主流企业级日志分析平台,其Web管理接口的认证机制直接关系到整个安全运营体系的可信边界。CVE-2018-11409本质上是REST API路由层会话校验缺失引发的未授权访问问题,根源在于`/en-US/splunkd/__raw/`路径绕过了splunkweb与splunkd之间的信任链验证,导致配置文件、用户哈希、App源码等敏感信息明文泄露。该漏洞凸显了Web接口权限模型设计失守的风险,尤其在默认配置未加固、HTTPS未启用、初始密码未修改的生产环境中危害急剧放大。结合vulfocus

weixin_30875157的博客 597

基于simulink的多能源系统协同与能源互联网的电网系统场景实例:虚拟电厂(VPP)中电网与储能集群的协同控制

本文详细介绍了使用Simulink构建虚拟电厂(VPP)与储能集群协同控制系统的完整建模过程。主要内容包括:1) VPP系统架构设计;2)分步骤建模过程,涵盖虚拟电厂系统创建、储能单元与集群建模、VPP控制器设计(核心)以及协同控制场景仿真;3)性能分析与典型应用场景。通过混合整数线性规划优化调度和智能指令分解策略,实现了VPP参与电力市场交易、电网调频调峰等功能,验证了系统在提升可再生能源消纳率(96%)、降低电网峰谷差(35%)等方面的优异性能。该建模方法为能源互联网中的分布式资源聚合与协同控制提供了实

xiaoheshang_123的博客 468

记一次JAVA使用ProcessBuilder执行Shell任务卡死问题分析

背景 最近由于某些原因需要把一些原本 location 在 oss (阿里云云对象存储)上的 hive 数据迁移到cosn(腾讯云对象存储)。目前一直在增量进行同步,在迁移之前需要进行数据的对比。至于对比的方法计划有两种,一种是对比 oss 和 cosn 对应文件下的文件所占磁盘空间大小,即使用 hadoop fs -du -s -h 路径 命令,然后对比相应表 location 的数据大小是否一...

苏苏爱自由 7341

科研必备:15款顶尖AI科研工具全面分析汇总(持续更新ing)

科研必备:15款AI科研工具全面分析汇总(持续更新ing)

Code_流苏:在代码中寻诗意,在实践中觅真知 9640

java 调用shell时出现假死问题(死锁问题)

java 调用shell时出现假死问题(死锁问题),org.springframework.dao.CannotAcquireLockException:Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction 现象:在使用java 调用 shell 执行相关命令时,当就会出现卡死等问题.然后就会报错org.spri

sunrj_niu的博客 1823

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java调shell中断假死_java 调用shell时出现假死问题

现象:在使用java 调用 shell 解压rar 文件,当文件数量较少时,没有任何问题.一旦文件数量超过500,就会出现卡死等问题.public static String exec(String cmd) {String result = "";try {String[] shellCmd = new String[] { "/bin/sh", "-c", cmd };Process ps =...

weixin_31429257的博客 258

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

java shell 错误_13 java 调用shell时出现假死问题

现象:在使用java 调用 shell 解压rar 文件,当文件数量较少时,没有任何问题.一旦文件数量超过500,就会出现卡死等问题.public static String exec(String cmd) {String result = "";try {String[] shellCmd = new String[] { "/bin/sh", "-c", cmd };Process ps =...

weixin_29607637的博客 324

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

JAVA使用运行时Runtime调用Shell假死问题(死锁)

JDK文档上还有如此解释:因为本地的系统对标准输入和输出所提供的缓冲池有效,所以错误的对标准输出快速的写入和从标准输入快速的读入都有可能造成子进程的所,甚至死锁。问题的关键在缓冲区这个地方:可执行程序的标准输出比较多,而运行窗口的标准缓冲区不够大,所以发生阻塞。

wsyzcj的博客 718

java 调cmd、shell 、exe

import java.io.BufferedInputStream; import java.io.IOException; public class copy {     ////scp -P 3737 -r /usr/local/tomcat7/webapps/ROOT/WEB-INF/page/jsp/ vlionosuser@192.168.8.22:/opt/tomcat

huairenkai的博客 311

java调shell中断假死_powershell 调用 OpenFileDialog类 假死问题解决。

我创建了一个打开文件的函数。代码内容:functionOpenfile{Add-Type-AssemblyNameSystem.Windows.Forms$openfile=New-ObjectSystem.Windows.Forms.OpenFileDialog$openfile.Filter='图片|*.jpg|AllFiles|*.*'$openfile.InitialD...

weixin_34345695的博客 184

java调shell中断假死_Powershell使用 OpenFileDialog类 假死问题解决。

我创建了一个打开文件的函数。代码内容:functionOpenfile{Add-Type-AssemblyNameSystem.Windows.Forms$openfile=New-ObjectSystem.Windows.Forms.OpenFileDialog$openfile.Filter=‘图片|*.jpg|AllFiles|*.*‘$openfile.InitialD...

weixin_29102619的博客 246

ProcessBuilder 死锁 没反应 假死 shell脚本 java

通过ProcessBuilder执行shel脚本时,由于脚本中含有wget语句,会产生大量下载进度信息到stderr,并且这些信息没有被读取,导致缓冲区被填满,进而导致子进程阻塞,无法继续执行。由于某些本地平台对标准输入和输出流的缓冲区大小有限,如果未能及时写入输入流或读取输出流,可能会导致进程阻塞,甚至死锁。因此上述两个方案要么把stderr中的日志读取出来,要么通过增加指令参数的方式减少日志打印。stderr和stdout是进程与外界通信的两个输出流,也可以理解为是两个缓冲区。

Dark_Dragon_King的博客 809

java 调用linux命令清理日志_java 执行shell命令及日志收集避坑指南

有时候我们需要调用系统命令执行一些东西,可能是为了方便,也可能是没有办法必须要调用。涉及执行系统命令的东西,则就不能做跨平台了,这和java语言的初衷是相背的。废话不多说,java如何执行shell命令?自然是调用java语言类库提供的接口API了。1. java执行shell的api执行shell命令,可以说系统级的调用,编程语言自然必定会提供相应api操作了。在java中,有两个api供调用:...

weixin_34513260的博客 422

java调用shell脚本实现百万数据的csv报表导出

  利用shell脚本访问远程数据库,实现百万级数据导出csv文件 背景:工作中报表导出大多用的poi方式进行导出excel文件,数据量在几千,几万的不用考虑性能问题,但是部分报表中数据量需要导出百万数据,导出操作为了有好体验,避免页面假死且可进行后续操作,导出操作均是跳转新的页面,而项目中服务的页面ngnix响应时间是30秒,而即使使用poi多线程导出,100万数据测试了下大概也需要90秒左右...

l1994m的博客 1381

日常shell工具--检查java服务是否假死,假死救活

【代码】日常shell工具--检查java服务是否假死,假死救活。

weixin_43834102的博客 495

java定时器quartz假死,java定时器quartz假死

java定时器quartz假死[2021-02-02 05:32:41]简介:这篇文章给大家介绍springboot+quartz以持久化的方式实现定时任务,详情如下所示:篇幅较长,耐心的人总能得到最后的答案小生第一次用quartz做定时任务,不足之处多多谅解。首先在sphp去除nbsp的方法:首先创建一个PHP代码示例文件;然后通过“preg_replace("/(\s|\&nbsp...

weixin_36289211的博客 992

java 执行shell命令及日志收集避坑指南

一个shell进程的调用,可能是一个比较耗时的操作,此时应该是只要任何进度,就应该汇报出来,从而避免外部看起来一直没有响应,从而无法判定是死掉了还是在运行中。它实际上并不能直接抛出异常,我们可以通过进程的返回码来判定是否发生了异常,这些错误码一般会遵循操作系统的错误定义规范,但时如果是我们自己写的shell或者其他同学写的shell就无法保证了。但如果你使用的系统调用,则不好处理了,因为每个系统支持的命令并非完全一样的,你的代码也就会因环境的不一样而表现不一致了。健壮性就下来了,所以,少用为好。

2501_90472555的博客 620
上一篇: webuploader大文件 分片 断点续传
下一篇: spring cloud config server 使用本地配置文件报错
Easy_____
博客等级 码龄14年 1粉丝 7原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值