前提:
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 中记事本, 如果我们不手动关闭记事本, 那么输出语句就不会执行, 这点事需要理解的.
来源: http://www.bubuko.com/infodetail-2683662.html