轉自:http://blog.csdn.net/lrenjundk/article/details/7249483
簡單的不帶通配符linux命令調用非常簡單,使用Runtime.getRuntime().exec(command)即可,如果要顯示錯誤,或者
輸出信息,得到相應的inputStream,既可以打印出信息.
但是對於以下命令:
ls /var/log/nginx/access.log.*
ls /var/log/nginx/access.log.* | grep 2011-05-16
grep "test=123&name=opencfg.com" /var/log/nginx/access.log.* > /root/alert.log
類似這樣的命令,process.exec是不會理解其中的*號與> 甚至管道符號|
這是由於在linux環境下,我們一般使用bash shell調用這些命令, 而其中的一些符號 諸如:
*, ?, >, < , | 這樣的符號是通過/bin/bash -c來做解釋後再傳遞給 所調用的命令
/bin/bash -c 這個參數已經作爲默認命令,在系統啓動時加載到運行環境中,所以我們敲以上命令的時候可以省略
但對於java的Process來說,不會識別這些符號,因此我們必須強制調用/bin/bash -c來幫我們做符號解釋:
下邊是一段測試代碼:
- import java.io.BufferedReader;
- import java.io.InputStreamReader;
- /**
- * CommandTest
- *
- * @author opencfg.com
- * @since 0.0.1-SNAPSHOT
- * @version 0.0.1-SNAPSHOT
- * @date 2011-05-17
- */
- public class CommandTest {
- public static void main(String[] args) throws Exception {
- // 1.test console args commands
- // exec("args", args);
- String[] commands = new String[] { "/bin/bash", "-c", "grep -h 200.*370.*http /var/log/nginx/access.log.* > /root/test_123.log" };
- String[] commands_ls = new String[] { "/bin/bash", "-c", "ls /var/log/nginx/access.log.*" };
- // 1.test java string commands
- exec("commands", commands);
- }
- public static void exec(String message, String[] args) throws Exception {
- print(message + ":");
- Process process = Runtime.getRuntime().exec(args);
- for (String arg : args) {
- System.out.println(arg);
- System.out.print(" ");
- }
- BufferedReader errorReader = new BufferedReader(new InputStreamReader(
- process.getInputStream()));
- String line = null;
- while ((line = errorReader.readLine()) != null) {
- System.err.println(line);
- }
- errorReader.close();
- BufferedReader infoReader = new BufferedReader(new InputStreamReader(
- process.getErrorStream()));
- while ((line = infoReader.readLine()) != null) {
- System.out.println(line);
- }
- infoReader.close();
- print("");
- }
- public static void print(String[] args) {
- for (String arg : args) {
- System.out.println(arg);
- System.out.print(" ");
- }
- }
- public static void print(String arg) {
- System.out.println(arg);
- }
- }