apache进程框架commons-exec,Java

Posted zhangphil

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了apache进程框架commons-exec,Java相关的知识,希望对你有一定的参考价值。

apache进程框架commons-exec,Java

pom.xml引用:

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-exec</artifactId>
            <version>1.3</version>
        </dependency>

import org.apache.commons.exec.*;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.Map;

public class Main 
    private static long processId = -1;

    public static void main(String[] args) 
        //无止境ping,但会再下面被ExecuteWatchdog设置的超时值终止进程而中断
        CommandLine commandLine = CommandLine.parse("ping 127.0.0.1 -t");

        DefaultExecutor executor = new DefaultExecutor() 
            @Override
            protected Process launch(CommandLine command, Map<String, String> env, File dir) throws IOException 
                Process process = super.launch(command, env, dir);
                processId = process.pid();
                System.out.println("进程id=" + processId);
                return process;
            
        ;
        executor.setExitValues(null);

        //如果进程运行时间超过timeOut毫秒,进程就自动结束(销毁)
        long timeOut = 5000;
        ExecuteWatchdog watchdog = new ExecuteWatchdog(timeOut);
        executor.setWatchdog(watchdog);

        final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        final ByteArrayOutputStream errorStream = new ByteArrayOutputStream();

        PumpStreamHandler streamHandler = new PumpStreamHandler(outputStream, errorStream);
        executor.setStreamHandler(streamHandler);

        ExecuteResultHandler erh = new ExecuteResultHandler() 
            @Override
            public void onProcessComplete(int exitValue) 
                // exitValue 0 表示进程任务正常完成后结束退出。
                // exitValue非0值表示异常结束进程。
                System.out.println("exitValue:" + exitValue);

                try 
                    String os = outputStream.toString("GBK");
                    System.out.println("onProcessComplete:" + os);
                 catch (Exception e) 
                    e.printStackTrace();
                
            

            @Override
            public void onProcessFailed(ExecuteException e) 
                e.printStackTrace();

                try 
                    String es = errorStream.toString("GBK");
                    System.out.println("onProcessFailed:" + es);
                 catch (Exception ee) 
                    ee.printStackTrace();
                
            
        ;

        try 
            executor.execute(commandLine, erh);
         catch (Exception e) 
            e.printStackTrace();
        

        System.out.println("end");
    

输出:

end
进程id=27652
exitValue:1
onProcessComplete:
正在 Ping 127.0.0.1 具有 32 字节的数据:
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=200
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=200
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=200
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=200
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=200

以上是关于apache进程框架commons-exec,Java的主要内容,如果未能解决你的问题,请参考以下文章

Java 执行系统命令工具类

Java使用Apache Commons Exec运行本地命令行命令

Java日志框架介绍

thinkPHP框架之初识篇

SpringBoot整合Slf4j+logback日志框架

使用PhantomJS在服务器端渲染并生成Echarts图片