`
天泪不死
  • 浏览: 27959 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Process应用之惑

阅读更多
   
    很多时候,我们需要调用系统命令来做些处理。比如,在程序中ping设备是否能连接,执行数据库的自动备份,以及程序的重启。这时候我们必须要使用Process类来完成这些功能。
    一般情况下,我们都会将命令执行过程中的信息输出,以便检查问题。但有时候我们还需知道这个执行的进程在什么时候结束,因为不仅要知道结束了,还要知道该进程完成时返回的结果。
    可能会说,这些不都是API已经给提供好的吗?过程中的消息可以用process.getInputStream()获取,进程最终结果可以由process.waitFor()得到。的确,这些看似可以办到,但其实,里面有陷阱。
   
首先以Runtime来创建我们需要的Process对象例子:
   
Process process = null;
		BufferedReader reader=null;
		try {
			process = Runtime.getRuntime().exec("ping 192.168.0.125");
			reader=new BufferedReader(new InputStreamReader(process.getInputStream()));
			String line=null;
			while((line=reader.readLine())!=null){
				System.out.println(line);
			}
			int result=process.waitFor();
			System.out.println(result);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

这个例子我们只是简单的ping了一个IP,用getInputStream()输出过程信息,然后用process.waitFor()得到执行完成后的结果。会发现一点问题都没有。
1.此时如果把process.getInputStream()换成process.getErrorStream(),就只有一个结果输出了。
2.如果把执行的内容换成EXP导个oralce数据库的命令呢!发现过程信息和结果值都有,但是如果拿到一个server上去跑跑,又发现总是会报错,rocess has not exited 进程未停止....在网上查询,很多人会告诉你是输出流导致进程阻塞,发生死锁了。
3.此时你再把process.getErrorStream()改回process.getInputStream(),发现啥也没有,而且程序不会停掉。这是肯定的,输出流又导致进程阻塞了。
    查API得知Process所有标准 io(即 stdin,stdout,stderr)操作都将通过三个流 (getOutputStream(),getInputStream(),getErrorStream()) 重定向到父进程。那为什么执行系统自带命令就能用getInputStream()获取到信息而不是系统自带命令就一定要用getErrorStream()来获取信息呢!惑之...待高手解答...
    获取进程返回结果有两个方法exitValue()和waitFor()。往往会发现流的堵塞无法使其得到值就报异常了。这个网上也有解答方法。即要清空getInputStream()和getErrorStream()这两个流。而且两个流的清空一定是异步的。
static void drainInBackground(final InputStream is) {
	        new Thread(new Runnable(){
	            public void run(){
	                try{
	                    while( is.read() >= 0 );
	                } catch(IOException e){ 
	                    // return on IOException                
	                }
	            }
	        }).start();
	    }


    有没有好的办法不写这个清空流的方法呢!或是还不明白,那就直接用ProcessBuilder来创建Process对象吧!ProcessBuilder已经给出了这方面的解决方案,但是必须要注意的是ProcessBuilder的redirectErrorStream方法。查API可知晓,redirectErrorStream方法设置为ture的时候,会将getInputStream(),getErrorStream()两个流合并,自动会清空流,无需我们自己处理。如果是false,getInputStream(),getErrorStream()两个流分开,就必须自己处理,程序如下:
try {
			ProcessBuilder pbuilder=new ProcessBuilder("ping","192.168.0.125");
			pbuilder.redirectErrorStream(true);
			process=pbuilder.start();
			reader=new BufferedReader(new InputStreamReader(process.getInputStream()));
			String line=null;
			while((line=reader.readLine())!=null){
				System.out.println(line);
			}	
			int result=process.waitFor();
			System.out.println(result);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

现在无论你调用的是系统自带命令还是配置环境变量的其他命令,getInputStream()流都能给你过程信息和执行结果。
如果redirectErrorStream设置为false,那结果会和上面所说一样。

最后,还要说的是,得到的process.waitFor()结果。别以为这个执行结果值是一层不变的0,API没有给出具体有多少种类型的返回值,就我测试的结果来看:
0 successfully
1 failure
3 successfully! but a warning
....2没有测试出来

经过一个上午的不断测试,找源码来看,查资料,终于将这个已经没有认真理会的API缺陷透彻的梳理了一遍。
为了不重复别的话,很多基础知识没有描述,本着重点解决问题和存在的问题。
分享到:
评论

相关推荐

    c#利用进程(Process)调用系统应用程序源码

    本文将深入探讨如何利用C#的Process类来调用系统应用程序,例如打开计算器、画图软件或记事本等。 首先,我们需要了解Process类的基本用法。以下是一个简单的示例,演示如何使用Process.Start()方法启动计算器程序...

    ProcessExplorer Windows系统和应用程序监视工具

    **ProcessExplorer:Windows系统与应用程序监视的神器** ProcessExplorer 是一款强大的系统监控工具,由微软旗下的Sysinternals Suite提供,它整合了Filemon和Regmon的功能,并在此基础上进行了多方面的扩展和优化...

    基于Process Simulate的机器人运动程序开发及应用.pdf

    基于Process Simulate的机器人运动程序开发及应用 基于Process Simulate的机器人运动程序开发及应用是当前汽车行业中的一种重要技术,旨在提高机器人离线编程效率和质量,大大减少真实环境调试的时间和成本。在此...

    psp+process dashboard应用ppt

    这个"PSP+Process Dashboard应用ppt"很可能是作者对PSP理论和Process Dashboard实际应用的总结和演示。PPT可能会涵盖以下几个部分: 1. **PSP基础理论**:介绍PSP的基本概念、目标和主要实践环节,可能包括PSP的五...

    c#打开QQ编程 Process 应用

    在C#编程中,`System.Diagnostics.Process` 类是用于与操作系统进程进行交互的重要工具,它允许开发者启动、控制以及与外部应用程序(如QQ)进行通信。`Process` 类提供了丰富的功能,包括启动新进程、终止进程、...

    JakeWharton最新力作——Process Phoenix,重启application process.zip

    Process Phoenix是他的又一创新之作,它解决了Android应用程序在进程被杀死后如何恢复的问题。 Process Phoenix的核心原理是利用了Android系统的BroadcastReceiver和Intent服务。当应用进程被系统终止时,系统会...

    进程黑客(Process Hacker)Processhacker-3.0.4132

    Process Hacker是一款针对高级用户的安全分析工具,它可以帮助研究人员检测和解决软件或进程在特定操作系统环境下遇到的问题。除此之外,它还可以检测恶意进程,并告知我们这些恶意进程想要实现的功能。 Process ...

    spss_process最新版v4.1.rar

    本文将深入探讨SPSS Process的核心功能、新特性以及在实际应用中的操作步骤。 一、SPSS Process的核心功能 1. 中介效应分析:SPSS Process能够帮助用户检测一个变量(X)通过另一个变量(M)对目标变量(Y)的影响...

    ProcessMonitor.zip

    标题 "ProcessMonitor.zip" 暗示我们关注的是一个与 Process Monitor 相关的压缩文件。Process Monitor 是微软出品的一款强大的系统监控工具,用于实时跟踪系统事件,包括文件系统、注册表、进程线程以及网络活动等...

    ProcessOn基本使用教程.docx

    ProcessOn 支持多种类型图,包括 Flowchart、EVC、EPC、BPMN、UML 等,非常方便制作,然后把制作好的图形进行导出,这样再把制作好的各类图形应用到其他软件中,操作非常简单。 知识点 1:ProcessOn 的基本特点 ...

    C语言头文件 PROCESS

    C语言头文件 PROCESSC语言头文件 PROCESSC语言头文件 PROCESSC语言头文件 PROCESSC语言头文件 PROCESSC语言头文件 PROCESSC语言头文件 PROCESSC语言头文件 PROCESSC语言头文件 PROCESSC语言头文件 PROCESSC语言...

    Process v3.4 for SPSS 中介调节效应分析插件

    Process是一款用于spss软件中的调节效应插件,专门进行分析中介效应和调节效应,Process主要应用于SPSS、SAS等传统数据统计分析软件,在SPSS中除了可以可视化操作外,还可以通过Syntax语法等方式操作,扩展功能更为...

    SPSS新版process插件

    **SPSS新版Process插件详解** SPSS(Statistical Product and Service Solutions)是一款广泛应用于社会科学、市场研究、健康科学等领域的统计分析软件。Process插件是SPSS中的一个强大工具,由哈佛大学的心理学...

    processv40.zip

    标题中的"processv40.zip"指的是一个压缩文件,它包含了PROCESS 4.0的最新版本,这是一款用于分析统计模型的插件工具。PROCESS,全称“Proposed Regressions for Causal Mediation and Moderation”,是由Andrew F. ...

    Process Simulate虚拟调试

    通过这些内容,我们可以看出Process Simulate虚拟调试技术在制造业中的应用,它帮助制造商在真实生产之前,通过虚拟模型对生产系统进行测试和优化,进而避免了实际生产中的潜在问题,提高了生产效率,降低了生产成本...

    process插件

    通过学习这些资源,用户不仅可以掌握Process插件的基本用法,还能深入理解Bootstrapping在中介效应分析中的应用,从而在科学研究中更加得心应手。总之,Process插件是SPSS用户进行高级统计分析的得力助手,尤其是对...

    process-exporter-0.7.10.linux-amd64.tar.gzprocess-exporter

    《process-exporter 0.7.10在Linux AMD64平台上的应用详解》 process-exporter是一款开源的监控工具,专为收集和暴露系统进程信息而设计,它能够将这些信息转换为Prometheus可读格式,从而方便进行性能监控和故障...

    Aspen Process Explorer 简介

    1. 曲线窗口:提供了充分访问生产过程的历史和实时数据的能力,工程师可以应用该控件对过程数据进行浏览和分析。 2. 动态图形:可以显示流程图或仿真画面,使用户对实时的工厂状态有一个清晰的了解。 3.灵活的工作...

    processhacker-2.39-bin

    9. **源代码开放**:ProcessHacker是开源项目,用户可以根据自己的需求修改源代码,这也是其吸引众多开发者和爱好者的原因之一。 10. **多语言支持**:ProcessHacker支持多种语言界面,包括中文,使得非英语用户也...

    SPSS的hayes process插件

    SPSS(Statistical Package for the Social Sciences)是一款广泛应用于社会科学领域的统计分析软件,而Hayes的Process插件则是SPSS中的一个强大工具,专为复杂因果关系分析设计,尤其在中介效应和调节效应的检验上...

Global site tag (gtag.js) - Google Analytics