天天看點

Runtime.exec()執行linux shell

最好的執行系統指令的方法就是寫個bat檔案或是shell腳本。然後調用,那樣修改和實作就簡點多了。

現在執行外部指令,主要的方式,還是通過調用所在平台的SHELL去完成,WINDOWS下面就用CMD,LINUX或者是UNIX下面就用SHELL,下面示範一個LINUX下面用SHELL的調用,并把結果回顯到控制台上,其它的應用程式類。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class RuntimeTest {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Process process;
		//String cmd = "ifconfig";//ok
		//String cmd = "sar -u 1 1| awk 'NR==4 {print $8}'";//空白。管道不支援
		String cmd = "/home/heyutao/workspace/ChunkOperator/sh/cpu.sh";//ok
		
		try {
			// 使用Runtime來執行command,生成Process對象
			Runtime runtime = Runtime.getRuntime();
			process = runtime.exec(cmd);
			// 取得指令結果的輸出流
			InputStream is = process.getInputStream();
			// 用一個讀輸出流類去讀
			InputStreamReader isr = new InputStreamReader(is);
			// 用緩沖器讀行
			BufferedReader br = new BufferedReader(isr);
			String line = null;
			while ((line = br.readLine()) != null) {
				System.out.println(line);
			}
			is.close();
			isr.close();
			br.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
           

cpu.sh的内容:

#!/bin/sh
#top
cpu=$(sar -u 1 1| awk 'NR==4 {print $8}')
ip=$(ifconfig | grep -E 'inet addr|inet 位址'| grep -v '127.0.0.1' | awk -F ':' '{print $2}' | awk '{print $1}')
echo  "cpu:$ip:$cpu"
           

執行結果如下:

cpu:59.64.158.126:80.68

Sun的doc裡其實說明還有其他的用法:

exec(String[] cmdarray, String[] envp, File dir)

Executes the specified command and arguments in a separate process with the specified environment and working directory.

那個dir就是調用的程式的工作目錄,這句其實還是很有用的。

Windows下調用程式

Process proc = Runtime . getRuntime () . exec ( " exefile " ) ;

Linux下調用程式就要改成下面的格式

Process proc = Runtime . getRuntime () . exec ( " ./exefile " ) ;

Windows下調用系統指令

String [] cmd = { " cmd " , " /C " , " copy exe1 exe2 " } ;

Process proc = Runtime . getRuntime () . exec ( cmd ) ;

Linux下調用系統指令就要改成下面的格式

String [] cmd = { " /bin/sh " , " -c " , " ln -s exe1 exe2 " } ;

Process proc = Runtime . getRuntime () . exec ( cmd ) ;

Windows下調用系統指令并彈出指令行視窗

String [] cmd = { " cmd " , " /C " , " start copy exe1 exe2 " } ;

Process proc = Runtime . getRuntime () . exec ( cmd ) ;

Linux下調用系統指令并彈出終端視窗就要改成下面的格式

String [] cmd = { " /bin/sh " , " -c " , " xterm -e ln -s exe1 exe2 " } ;

Process proc = Runtime . getRuntime () . exec ( cmd ) ;

還有要設定調用程式的工作目錄就要

Process proc = Runtime . getRuntime () . exec ( " exeflie " , null , new File ( " workpath " )) ;

繼續閱讀