Java 執行Shell腳本指令

1、介紹

有時候咱們在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

  1. cmdarray: 包含所調用命令及其參數的數組。 
  2. command: 一條指定的系統命令。
  3. envp: 字符串數組,其中每一個元素的環境變量的設置格式爲name=value;若是子進程應該繼承當前進程的環境,則該參數爲 null。
  4. dir: 子進程的工做目錄;若是子進程應該繼承當前進程的工做目錄,則該參數爲 null。

細心的讀者會發現,爲了執行調用操做,JVM會啓一個Process,因此咱們能夠經過調用Process類的如下方法,得知調用操做是否正確執行:linux

abstract  int waitFor()   
致使當前線程等待,若有必要,一直要等到由該 Process 對象表示的進程已經終止。

 

2、調用Shell腳本

 

一、獲取鍵盤輸入

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格式)

三、java程序

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();

        }
    }
}

其中文件路徑爲絕對路徑,這點須要注意。

3、調試心得

在調試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格式)

此時網上程序能夠了,而後看到指令不一樣,修改指令便可以了。

最後終於調通了,看來格式經驗不足啊

 

4、參考文獻

一、java調用shell腳本並傳遞參數

二、JAVA調用Shell腳本

相關文章
相關標籤/搜索