概要说明:
java程序中要执行linux命令主要依赖两个类:Process和Runtime
首先说明一下Process类:
Process类是一个抽象类,封装了一个进程(即一个执行程序);
Process类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁进程的方法。
ProcessBuilder.start()和Runtime.exec方法创建一个本机进程,并返回Process子类的一个实例,该实例可用来控制进程并获取进程的相关信息。
创建进程的方法可能无法针对某些本机平台上的特定进程很好的工作,比如,本机窗口进程,守护进程,Microsoft Windows上的Win16/DOS进程,或者shell脚本。创建的子进程没有自己的终端或者控制台。它的所有标准io操作都将通过三个流(getOutputStream(),getInputStream(),getErrorStream())重定向到父进程。父进程使用这些流来提供到子进程的输入和获得从子进程的输出。因为有些本机平台只针对标准输入和输出流提供有限的缓冲区大小,如果读写子进程的输出流或者输入流迅速出现失败,则可能导致子进程阻塞,甚至产生死锁。
当没有Process更多引用的时候,不是删掉子进程,而是继续异步执行子进程。
方法:
destroy() 杀掉子进程
exitValue() 返回子进程的出口值
InputStream getErrorStream() 获得子进程的错误流
InputStream getInputStream() 获得子进程的输入流
OutputStream getOutputStream() 获得子进程的输出流
waitFor() 导致当前进程等待,如果必要,一直要等到由该Process对象表示的进程已经终止。
创建Process对象的方法:
(1)每个processBuilder实例管理一个进程属性集。start()方法利用这些属性创建一个新的Process实例。start()方法可以从同一实例重复调用,以利用相同的或者相关的属性创建新的子进程。
(2)Runtime.exec()方法创建一个本机进程,并返回Process子类的一个实例。
再来看一下Runtime类:
每个java应用程序都有一个Runtime类的实例,使应用程序能够与其运行的环境相连接。可以通过getRuntime方法获取当前的运行环境。
应用程序不能创建自己的Runtime类的实例。
几个主要方法的介绍:
- Process exec(String command)
- 在单独的进程中执行指定的字符串命令。
- Process exec(String command, String[] envp)
- 在指定环境的单独进程中执行指定的字符串命令。
- Process exec(String command, String[] envp, File dir)
- 在有指定环境和工作目录的独立进程中执行指定的字符串命令。
- Process exec(String[] cmdarray)
- 在单独的进程中执行指定命令和变量。
- Process exec(String[] cmdarray, String[] envp)
- 在指定环境的独立进程中执行指定命令和变量。
- Process exec(String[] cmdarray, String[] envp, File dir)
- 在指定环境和工作目录的独立进程中执行指定的命令和变量。
command:一条指定的系统命令。
envp:环境变量字符串数组,其中每个环境变量的设置格式是:name=value;如果子进程应该继承当前进程的环境,则该参数为null。
dir:子进程的工作目录,如果子进程应该继承当前进程的工作目录,则该参数为null
cmdarray:包括所调用命令及其参数的数组。
以下是调用实例:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class LinuxOrder {
public static void main(String[] args) throws IOException,
InterruptedException {
Process process = Runtime.getRuntime().exec(
new String[] { "sh", "/home/liumengyang/test.sh" });
process.waitFor();
InputStream in = process.getInputStream();
BufferedReader read = new BufferedReader(new InputStreamReader(in));
String result = read.readLine();
System.out.println("INFO:" + result);
}
}