zoukankan      html  css  js  c++  java
  • 使用java代码执行linux命令

    前提:

    java代码是在windows下面写的,要打包放到linux下面运行,并且执行某个脚本。

    java代码:

           try {
              // 起作用的代码其实就下面这一行, 参数是linux中要执行的代码 Runtime.getRuntime().exec("sh generator.sh").waitFor(); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); }

    转自:https://www.cnblogs.com/tohxyblog/p/6501396.html

    java在企业级项目开发中,无论是强制性的功能需要,还是为了简便java的实现,需要调用服务器命令脚本来执行。在java中,RunTime.getRuntime().exec()就实现了这个功能。

    用法:

    // 在单独的进程中执行指定的字符串命令
    public
    Process exec(String command)
    // 在单独的进程中执行指定命令和变量
    public
    Process exec(String[] cmdArray)
    // 在指定环境的独立进程中执行指定命令和变量
    public
    Process exec(String command,String[] envp)
    // 在指定环境的独立进程中执行指定命令和变量
    public
    Process exec(String[] cmdArray,String[] envp)
    // 在有指定的环境和工作目录的独立进程中执行指定的字符串命令
    public
    Process exec(String command,String[] encp,File dir)
    // 在指定环境和工作目录的独立进程中执行指定的命令和变量
    public
    Process exec(String[] cmdarray,String[] envp,File dir)

    举例:

    1、

    // 在windows下相当于直接调用 /开始/搜索程序和文件的指令,比如
    RunTime.getRuntime().exec(String command);  //打开windows下记事本

    2、

    public Process exec(String[] cmdArray);
    // Linux下
    Runtime.getRuntime().exec(new String[]{/bin/sh","-c"});
    // Windows下
    Runtime.getRuntime().exec(new String[]{"cmd","/c",cmds});

    深入:

    Process的几种方法

    1、destroy():杀掉子进程

    2、exitValue():返回子进程的出口值,值0表示正常终止

    3、getErrorStream():获取子进程的错误流

    4、getInputStream():获取子进程的输入流

    5、getOutputStream():获取子进程的输出流

    6、waitFor():导致当前线程等待,如有必要,一直要等到由该Process对象表示的进程已经终止。如果已终止该子进程,此方法立即返回。如果没有终止该子进程,调用的线程将被阻塞,知道退出子进程,根据管理,0表示正常终止。

    注意:在Java中,调用runtime线程执行脚本是非常消耗资源的,所以切记不要频繁使用!

    在调用runtime去执行脚本的时候,其实就是JVM开了一个子线程去调用JVM所在系统的命令,其中开了三个通道:输入流、输出流、错误流,其中输出流就是子线程走调用的通道。

    大家都知道,waitFor是等待子线程执行命令结束后才访问,但是在runtime中,打开程序的命令如果不关闭,就不算子线程结束,比如如下代码。

    private static Process p = null;
    p = Runtime.getRuntime().exec("notepad.exe");
    p.waitFor();
    System.out.println("---------------我被执行了");

    以上代码中,打开windows中记事本,如果我们不手动关闭记事本,那么输出语句就不会执行,这点事需要理解的。

  • 相关阅读:
    来看看面试必问的HashMap,一次彻底帮你搞定HashMap源码
    深入浅出!springboot从入门到精通,实战开发全套教程!
    讲一讲Java的字符串常量池,看完你的思路就清晰了
    面向对象的这些核心技术,你掌握后包你面试无忧
    他凭借这70份PDF,3170页文件,成功斩获了含BATJ所有的offer
    springboot实战开发全套教程,让开发像搭积木一样简单!Github星标已上10W+!
    这行代码告诉你!为什么你地下城与勇士(DNF)的装备强化老是失败?
    精益求精!Spring Boot 知识点全面回顾,带你重新细读源码!
    太妙了!Spring boot 整合 Mybatis Druid,还能配置监控?
    putchar(".:-=+*#%@"[(int)(d * 5.0f)])
  • 原文地址:https://www.cnblogs.com/zhanzhuang/p/9304502.html
Copyright © 2011-2022 走看看