一、Java调用Linux系统的命令非常简单
这是一个非常常用的调用方法示例:
1 public String executeLinuxCmd(String cmd) {
2 System.out.println("got cmd job : " + cmd);
3 Runtime run = Runtime.getRuntime();
4 try {
5 Process process = run.exec(cmd);
6 InputStream in = process.getInputStream();
7 BufferedReader bs = new BufferedReader(new InputStreamReader(in));
8 // System.out.println("[check] now size \n"+bs.readLine());
StringBuffer out = new StringBuffer();
byte[] b = new byte[8192];
for (int n; (n = in.read(b)) != -1;) {
out.append(new String(b, 0, n));
}
System.out.println("job result [" + out.toString() + "]");
14 in.close();
15 // process.waitFor();
16 process.destroy();
17 return result;
18 } catch (IOException e) {
19 e.printStackTrace();
20 }
21 return null;
22 }
二、含有管道符(|)多级命令串联查询
public List<String> executeLinuxCmd(String cmd) {
System.out.println("got cmd job : " + cmd);
Runtime run = Runtime.getRuntime();
try {
// Process process = run.exec(cmd);
Process process = run.exec(new String[] {"/bin/sh", "-c", cmd});
InputStream in = process.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();
}
return null;
}
三、含有cd操作的方法示例
1. 问题背景
1.1 java程序运行在/home/lings目录下;
1.2 希望删除/home/test目录下的文件proxy.log;
1.3 调用上面的接口两次?
executeLinuxCmd("cd /home/test");
executeLinuxCmd("rm -fr /home/proxy.log");
是不行的!
1.4 这个接口的调用是单次事务型的,就是每次调用都是独立的事务或者说操作,没有关联的。
那这种“复杂”一点的操作流程怎么办呢?
1.5 方法a: 可以写一个独立的脚本,然后一次运行脚本,这样多复杂的逻辑都没问题。
1.6 方法b: 可以启动一个shell长连接,保持连接,发送多条命令,最后释放连接。
示例逻辑代码:
1 public void executeNewFlow() {
2 Runtime run = Runtime.getRuntime();
3 File wd = new File("/bin");
4 System.out.println(wd);
5 Process proc = null;
6 try {
7 proc = run.exec("/bin/bash", null, wd);
8 } catch (IOException e) {
9 e.printStackTrace();
10 }
11 if (proc != null) {
12 BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
13 PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())), true);
14 out.println("cd /home/test");
15 out.println("pwd");
16 out.println("rm -fr /home/proxy.log");
17 out.println("exit");//这个命令必须执行,否则in流不结束。
18 try {
19 String line;
20 while ((line = in.readLine()) != null) {
21 System.out.println(line);
22 }
23 proc.waitFor();
24 in.close();
25 out.close();
26 proc.destroy();
27 } catch (Exception e) {
28 e.printStackTrace();
29 }
30 }
31 }
三的优化和演进(返回值)
public List<String> executeNewFlow(List<String> commands) {
List<String> rspList = new ArrayList<String>();
Runtime run = Runtime.getRuntime();
try {
Process proc = run.exec("/bin/bash", null, null);
BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())), true);
for (String line : commands) {
out.println(line);
}
// out.println("cd /home/test");
// out.println("pwd");
// out.println("rm -fr /home/proxy.log");
out.println("exit");// 这个命令必须执行,否则in流不结束。
String rspLine = "";
while ((rspLine = in.readLine()) != null) {
System.out.println(rspLine);
rspList.add(rspLine);
}
proc.waitFor();
in.close();
out.close();
proc.destroy();
} catch (IOException e1) {
e1.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return rspList;
}
上善若水,水利万物而不争。