如何用JAVA调用服务器系统指令

简介: 如何用JAVA调用服务器系统指令

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)//在指定环境的独立进程中执行指定的命令和变量

Linux下:

String[] envp = { "LANG=UTF-8" };
String[] comands = new String[] { "/bin/sh", "-c", args};
Process process = Runtime.getRuntime().exec(comands, envp);

Windows下:

String[] envp = { "LANG=UTF-8" };
String[] comands = new String[] { "cmd", "/c", args};
Process process = Runtime.getRuntime().exec(comands, envp);

进阶:

Process的几种方法:

destroy():杀掉子进程
exitValue():返回子进程的出口值,值 0 表示正常终止
getErrorStream():获取子进程的错误流
getInputStream():获取子进程的输入流
getOutputStream():获取子进程的输出流
waitFor():导致当前线程等待,如有必要,一直要等到由该 Process 对象表示的进程终止。如果子进程结束,此方法立即返回。如果该子进程没结束,调用的线程将被阻塞,直到子进程退出,

笔者在用mysql和mysqldump指令进行智能和服时,遇到主键冲突没法正常返回,后来发现是因为没有读取错误流导致。

根据惯例,0 表示正常终止(即使比如mysql指令的主键冲突,只要是指令的返回也算是正常终止),

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

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

 process的阻塞:

在runtime执行大点的命令中,输入流和错误流会不断有流进入存储在JVM的缓冲区中,如果缓冲区的流不被读取被填满时,就会造成runtime的阻塞。所以在进行比如:大文件复制等的操作时,我们还需要不断的去读取JVM中的缓冲区的流,来防止Runtime的死锁阻塞。

 

最后附上在linux 上封装的方法供参考:

/**
   * @param daemon true,后台执行,false,直接执行
   * @param args 指令行
   */
  public static Result sendCommand(boolean daemon,String args) {
    logger.info("args={}", args);
    StringBuilder builder = new StringBuilder();
  //  InputStreamReader ir = null;
  //  LineNumberReader input = null;
    try {
      String[] envp = { "LANG=UTF-8" };
      Process process=null;
      if(daemon) {
        String[] comands = new String[] { "/bin/sh", "-c", args};
        process = Runtime.getRuntime().exec(comands, envp);
        process.waitFor();
      }else {
        process = Runtime.getRuntime().exec(args, envp);
        process.waitFor(60,TimeUnit.SECONDS);
      }
      try (InputStreamReader ir =  new InputStreamReader(process.getInputStream(), Charset.forName("UTF-8"));LineNumberReader input = new LineNumberReader(ir)) {
        String tmp = "";
        while ((tmp = input.readLine()) != null) {
          builder.append(tmp).append("\n");
        }
      }catch (Exception e) {
        logger.error(e.getMessage(), e);
        return new Result(ErrorCode.EC_FAILED, e.getMessage());
      }
      try (InputStreamReader ir =  new InputStreamReader(process.getErrorStream(), Charset.forName("UTF-8"));LineNumberReader input = new LineNumberReader(ir)) {
        String tmp = "";
        while ((tmp = input.readLine()) != null) {
          builder.append(tmp).append("\n");
        }
      }catch (Exception e) {
        logger.error(e.getMessage(), e);
        return new Result(ErrorCode.EC_FAILED, e.getMessage());
      }
    } catch (Exception e) {
      logger.error(e.getMessage(), e);
      return new Result(ErrorCode.EC_FAILED, e.getMessage());
    }
    String result = builder.toString();
    if (StringUtils.isNotEmpty(result)&&StringUtils.containsIgnoreCase(result, "ERROR")) {
      logger.info("result={}", result);
      return new Result(ErrorCode.EC_FAILED, result);
    } else {
      return new Result(ErrorCode.EC_OK);
    }
  }

 

目录
相关文章
|
12天前
|
运维 Java
Java版HIS系统 云HIS系统 云HIS源码 结构简洁、代码规范易阅读
云HIS系统分为两个大的系统,一个是基层卫生健康云综合管理系统,另一个是基层卫生健康云业务系统。基层卫生健康云综合管理系统由运营商、开发商和监管机构使用,用来进行运营管理、运维管理和综合监管。基层卫生健康云业务系统由基层医院使用,用来支撑医院各类业务运转。
37 5
|
9天前
|
Linux 网络安全 数据安全/隐私保护
SSH工具连接远程服务器或者本地Linux系统
SSH工具连接远程服务器或者本地Linux系统
15 0
|
3天前
|
弹性计算 运维 Java
Serverless 应用引擎产品使用之在Serverless 应用引擎中,将 Java 应用从 ECS 迁移到 SAE如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
30 2
|
4天前
|
监控 Java BI
java基于云计算的SaaS医院his信息系统源码 HIS云平台源码
基于云计算技术的B/S架构的HIS系统源码,SaaS模式Java版云HIS系统,融合B/S版电子病历系统,支持电子病历四级,HIS与电子病历系统均拥有自主知识产权。
24 5
|
4天前
|
监控 负载均衡 网络协议
|
7天前
|
Java 关系型数据库 MySQL
基于swing的java物业管理系统
基于swing的java物业管理系统
18 5
|
7天前
|
设计模式 JavaScript Java
[设计模式Java实现附plantuml源码~结构型] 扩展系统功能——装饰模式
[设计模式Java实现附plantuml源码~结构型] 扩展系统功能——装饰模式
|
8天前
|
监控 安全 Linux
Linux系统之安装ServerBee服务器监控工具
【4月更文挑战第22天】Linux系统之安装ServerBee服务器监控工具
51 2
|
12天前
|
JavaScript Java 测试技术
基于Java的珠宝购物网站系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的珠宝购物网站系统的设计与实现(源码+lw+部署文档+讲解等)
24 0
|
12天前
|
JavaScript Java 测试技术
基于Java的电影评论系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的电影评论系统的设计与实现(源码+lw+部署文档+讲解等)
30 0