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[] envp,File dir)
//在指定环境和工作目录的独立进程中执行指定的命令和变量
public Process exec(String[] cmdarray,String[] envp,File dir)
Process的几种方法:
1.destroy(): # 杀掉子进程
2.exitValue(): # 返回子进程的出口值,值 0 表示正常终止
3.getErrorStream():# 获取子进程的错误流
4.getInputStream():# 获取子进程的输入流
5.getOutputStream():# 获取子进程的输出流
6.waitFor():# 导致当前线程等待,如有必要,一直要等到由该 Process 对象表示的进程已经终止。如果已终止该子进程,此方法立即返回。如果没有终止该子进程,调用的线程将被阻塞,直到退出子进程,根据惯例,0 表示正常终止
详解
public Process exec(String[] cmdarray, String[] envp, File dir)
throws IOException // 在指定环境和工作目录的独立进程中执行指定的命令和变量。
参数:
cmdarray
– 包含所调用命令及其参数的数组。 表示一个命令行标记envp
– 字符串数组,其中每个元素的环境变量的设置格式为 name=value,如果子进程应该继承当前进程的环境,如果envp
为 null,那么子进程会继承当前进程的环境设置。dir
– 子进程的工作目录;如果子进程应该继承当前进程的工作目录,则该参数为 null。
返回:
- 一个新的 Process 对象,用于管理子进程
检查 cmdarray
是否是一条有效的操作系统命令。哪些命令有效取决于系统,但是该命令至少必须有一个非 null 字符串的非空列表。
启动操作系统进程的方式完全取决于系统。其中有很多方面会导致错误:
- 未找到操作系统程序文件。
- 对程序文件的访问被拒绝。
- 工作目录不存在。
- 这些情况都会抛出一个异常。该异常的具体特性取决于系统,但它总是 IOException 的一个子类。
实战:
如果要在java程序里执行一条linux可以用下面的写法
Process process = Runtime.getRuntime().exec(cmd);
process.waitFor();
但是当遇到像cd这样的命令时,上面的这种写法切不管用,很多时候我们以为是命令输错了或是文件找不到,实际不是。下面给出对应的方法:
含有管道符(|)多级命令串联查询
public List<String> executeLinuxCmd(String cmd) {
System.out.println("cmd = : " + cmd);
try {
Process proc = Runtime.getRuntime().exec(new String[] {"/bin/sh", "-c", cmd});
InputStream in = proc.getInputStream();
BufferedReader bs =
new BufferedReader(new InputStreamReader(in));
List<String> list = new ArrayList<String>();
String result = null;
while ((result = bs.readLine()) != null) {
System.out.println("job result [" + result + "]");
list.add(result);
}
in.close();
// process.waitFor();
process.destroy();
return list;
} catch (IOException e) {
e.printStackTrace();
}finally{
}
return null;
}
含有cd操作的方法示例
- 问题背景
1.1 使用java的process实现
tar
命令的压缩,将指定文件夹下的文件压缩到指定路径下。如果直接使用
tar -zxvf qynj/file/bdapData/a.tar.gz /qynj/file/bdapData/
则压缩的文件夹会出现多级目录。
通用方法(可以实现多命令传递,又可以获取控制台日志)
public List<String> executeCmd(List<String> commands) {
List<String> rspList = new ArrayList<String>();
Process proc = null;
BufferedReader in = null;
PrintWriter out = null;
try {
proc = Runtime.getRuntime().exec("/bin/bash", null, null);
in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())), true);
for (String line : commands) {
out.println(line);
}
out.println("exit");// 这个命令必须执行,否则in流不结束。
String rspLine = "";
while ((rspLine = in.readLine()) != null) {
rspList.add(rspLine);
}
proc.waitFor();
} catch (IOException e1) {
e1.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
if(out != null){
out.close();
}
if(in != null){
in.close();
}
proc.destroy();
}
return rspList;
}
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("cd /qynj/qynjdatabakp/file/bdapData");
list.add("tar -zxvf ./asd.tar.gz ./asd/");
List<String> strs = executeCmd(list);
}
评论前必须登录!
注册