有時候咱們在Linux中運行Java程序時,須要調用一些Shell命令和腳本。而Runtime.getRuntime().exec()方法給咱們提供了這個功能,並且Runtime.getRuntime()給咱們提供瞭如下幾種exec()方法:html
Process exec(String command)
在單獨的進程中執行指定的字符串命令。
Process exec(String[] cmdarray)
在單獨的進程中執行指定命令和變量。
Process exec(String[] cmdarray, String[] envp)
在指定環境的獨立進程中執行指定命令和變量。
Process exec(String[] cmdarray, String[] envp, File dir)
在指定環境和工做目錄的獨立進程中執行指定的命令和變量。
Process exec(String command, String[] envp)
在指定環境的單獨進程中執行指定的字符串命令。
Process exec(String command, String[] envp, File dir)
在有指定環境和工做目錄的獨立進程中執行指定的字符串命令。
其中,其實cmdarray和command差很少,同時若是參數中若是沒有envp參數或設爲null,表示調用命令將在當前程序執行的環境中執行;若是沒有dir參數或設爲null,表示調用命令將在當前程序執行的目錄中執行,所以調用到其餘目錄中的文件和腳本最好使用絕對路徑。各個參數的含義:java
細心的讀者會發現,爲了執行調用操做,JVM會啓一個Process,因此咱們能夠經過調用Process類的如下方法,得知調用操做是否正確執行:linux
abstract int waitFor() 致使當前線程等待,若有必要,一直要等到由該 Process 對象表示的進程已經終止。
BufferedReader reader = null; try{ reader = new BufferedReader(new InputStreamReader(System.in)); System.out.println("請輸入IP:"); String ip = reader.readLine();
上述指令基本很常見:web
一、建立讀入器:BufferReadershell
二、將數據流載入BufferReader,即InputStreamReader數組
三、將系統輸入載入InputStreamReader中bash
四、而後利用reader獲取數據。app
shell運行腳本指令爲 sh **.sh args,其實這個格式與java格式相同。webapp
個人腳本爲:編碼
#!/bin/sh
#根據進程名殺死進程
echo "This is a $call"
if [ $# -lt 2 ]
then
echo "缺乏參數:procedure_name和ip"
exit 1
fi
echo "Kill the $1 process"
PROCESS=`ps -ef|grep $1|grep $2|grep -v grep|grep -v PPID|awk '{ print $2}'`
for i in $PROCESS
do
echo "Kill the $1 process [ $i ]"
done
其實全部準備若當,就是沒法讀取裏面的數據,執行shell指令,緣由就是:
注意事項:
1.shell腳本必須有執行權限,好比部署後chmod -R 777 /webapps
2.shell文件,必須是UNIX格式,ANSI編碼格式,不然容易出問題(能夠用notepad++,編輯->文檔格式轉換,格式->轉爲ANSI格式(UNIX格式)
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; /** * @author :dongbl * @version : * @Description: * @date :9:19 2017/11/14 */ public class TestBash { public static void main(String [] args){ BufferedReader reader = null; try{ reader = new BufferedReader(new InputStreamReader(System.in)); System.out.println("請輸入IP:"); String ip = reader.readLine(); String bashCommand = "sh "+ "/usr/local/java/jdk1.8.0_121/lib/stopffmpeg.sh" + " ffmpeg " + ip; // String bashCommand = "chmod 777 " + "/usr/local/java/jdk1.8.0_121/lib/stopffmpeg.sh" ; // String bashCommand = "kill -9" + ip; System.out.println(bashCommand); Runtime runtime = Runtime.getRuntime(); Process pro = runtime.exec(bashCommand); int status = pro.waitFor(); if (status != 0) { System.out.println("Failed to call shell's command "); } BufferedReader br = new BufferedReader(new InputStreamReader(pro.getInputStream())); StringBuffer strbr = new StringBuffer(); String line; while ((line = br.readLine())!= null) { strbr.append(line).append("\n"); } String result = strbr.toString(); System.out.println(result); } catch (IOException ec) { ec.printStackTrace(); } catch (InterruptedException ex){ ex.printStackTrace(); } } }
其中文件路徑爲絕對路徑,這點須要注意。
在調試shell腳本執行過程當中,反了幾個錯
一、開始指令爲:
String bashCommand = "/usr/local/java/jdk1.8.0_121/lib/stopffmpeg.sh "+ " ffmpeg " + ip;
程序報錯,權限不足。
二、此時修改成:
String bashCommand = "chmod 777 "+"/usr/local/java/jdk1.8.0_121/lib/stopffmpeg.sh "+ " ffmpeg " + ip;
記住必定注意空格(格式)但此時依然沒法指定腳本指令。三、在發現格式不對後,修改後,仍是不行,此時指令爲:
String bashCommand = "sh "+ "/usr/local/java/jdk1.8.0_121/lib/stopffmpeg.sh" + " ffmpeg " + ip;
這是沒法讀取內容的關鍵緣由,由於sh文件是在Windows系統下生成的,因此須要將格式修改成linux格式的,即(UNIX格式)
此時網上程序能夠了,而後看到指令不一樣,修改指令便可以了。
最後終於調通了,看來格式經驗不足啊