亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java調(diào)用Shell命令和腳本的實(shí)現(xiàn)

 更新時(shí)間:2021年02月23日 10:20:42   作者:GatsbyNewton  
這篇文章主要介紹了Java調(diào)用Shell命令和腳本的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

1.介紹

有時(shí)候我們?cè)贚inux中運(yùn)行Java程序時(shí),需要調(diào)用一些Shell命令和腳本。而Runtime.getRuntime().exec()方法給我們提供了這個(gè)功能,而且Runtime.getRuntime()給我們提供了以下幾種exec()方法:

Process exec(String command) 
在單獨(dú)的進(jìn)程中執(zhí)行指定的字符串命令。 
Process exec(String[] cmdarray) 
在單獨(dú)的進(jìn)程中執(zhí)行指定命令和變量。 
Process exec(String[] cmdarray, String[] envp) 
在指定環(huán)境的獨(dú)立進(jìn)程中執(zhí)行指定命令和變量。 
Process exec(String[] cmdarray, String[] envp, File dir) 
在指定環(huán)境和工作目錄的獨(dú)立進(jìn)程中執(zhí)行指定的命令和變量。 
Process exec(String command, String[] envp) 
在指定環(huán)境的單獨(dú)進(jìn)程中執(zhí)行指定的字符串命令。 
Process exec(String command, String[] envp, File dir) 
在有指定環(huán)境和工作目錄的獨(dú)立進(jìn)程中執(zhí)行指定的字符串命令。 

其中,其實(shí)cmdarray和command差不多,同時(shí)如果參數(shù)中如果沒(méi)有envp參數(shù)或設(shè)為null,表示調(diào)用命令將在當(dāng)前程序執(zhí)行的環(huán)境中執(zhí)行;如果沒(méi)有dir參數(shù)或設(shè)為null,表示調(diào)用命令將在當(dāng)前程序執(zhí)行的目錄中執(zhí)行,因此調(diào)用到其他目錄中的文件和腳本最好使用絕對(duì)路徑。各個(gè)參數(shù)的含義:

  • cmdarray: 包含所調(diào)用命令及其參數(shù)的數(shù)組。
  • command: 一條指定的系統(tǒng)命令。
  • envp: 字符串?dāng)?shù)組,其中每個(gè)元素的環(huán)境變量的設(shè)置格式為name=value;如果子進(jìn)程應(yīng)該繼承當(dāng)前進(jìn)程的環(huán)境,則該參數(shù)為 null。
  • dir: 子進(jìn)程的工作目錄;如果子進(jìn)程應(yīng)該繼承當(dāng)前進(jìn)程的工作目錄,則該參數(shù)為 null。

細(xì)心的讀者會(huì)發(fā)現(xiàn),為了執(zhí)行調(diào)用操作,JVM會(huì)啟一個(gè)Process,所以我們可以通過(guò)調(diào)用Process類的以下方法,得知調(diào)用操作是否正確執(zhí)行:

abstract int waitFor() 
導(dǎo)致當(dāng)前線程等待,如有必要,一直要等到由該 Process 對(duì)象表示的進(jìn)程已經(jīng)終止。 

進(jìn)程的出口值。根據(jù)慣例,0 表示正常終止;否則,就表示異常失敗。
另外,調(diào)用某些Shell命令或腳本時(shí),會(huì)有返回值,那么我們?nèi)绻东@這些返回值或輸出呢?為了解決這個(gè)問(wèn)題,Process類提供了:

abstract InputStream getInputStream() 
獲取子進(jìn)程的輸入流。 最好對(duì)輸入流進(jìn)行緩沖。

2.調(diào)用Shell命令

這里為了說(shuō)明問(wèn)題,我僅用tar命令進(jìn)行演示。tar命令是一個(gè)打包而不進(jìn)行壓縮的命令。同時(shí),為了檢查tar的調(diào)用是否被正常執(zhí)行,我將調(diào)用waitFor()方法。

private void callCMD(String tarName, String fileName, String... workspace){
 try {
 String cmd = "tar -cf" + tarName + " " + fileName;
//      String[] cmd = {"tar", "-cf", tarName, fileName};
 File dir = null;
 if(workspace[0] != null){
  dir = new File(workspace[0]);
  System.out.println(workspace[0]);
 }
 process = Runtime.getRuntime().exec(cmd, null, dir);
//     process = Runtime.getRuntime().exec(cmd);
 int status = process.waitFor();
 if(status != 0){
  System.err.println("Failed to call shell's command and the return status's is: " + status);
 }
 }
 catch (Exception e){
 e.printStackTrace();
 }
}

注意:如果把命令放到一個(gè)String[]中時(shí),必須把命令中每個(gè)部分作為一個(gè)元素存在String[]中,或者是把命令按照空格符分割得到的String[]。

String[] cmd = {"tar", "-cf", tarName, fileName}; //right
String[] cmd = {"tar -cf", tarName, fileName};  //error

為了說(shuō)明dir參數(shù)的作用,我特地把該Java程序和要打包的目錄hive/放在不同的目錄:

/root/workspace/eclipse/Test/src/edu/wzm/CallShell.java
/root/experiment/hive

如果我不設(shè)置dir或設(shè)dir為null,那么fileName不得不是相對(duì)路徑,最好是絕對(duì)路徑:

call.callCMD("/root/experiment/hive.tar", "/root/experiment/hive", null);
// OR
call.callCMD("/root/experiment/hive.tar", "/root/experiment/hive");

如果我設(shè)置了dir指向了hive所在的父目錄就好辦多了:

call.callCMD("hive.tar", "hive", "/root/experiment/");

3.調(diào)用Shell腳本

Java調(diào)用Shell命令和調(diào)用Shell腳本的操作一模一樣。我這里介紹另外幾個(gè)方面:

  1. 給腳本傳遞參數(shù);
  2. 捕獲調(diào)用的輸出結(jié)果;
  3. envp的使用。

給腳本傳遞參數(shù),這個(gè)操作很簡(jiǎn)單,無(wú)非是把參數(shù)加到調(diào)用命令后面組成String,或String[]。

捕獲調(diào)用輸出信息,前面也提到過(guò)用Process.getInputStream()。不過(guò),建議最好對(duì)輸入流進(jìn)行緩沖:

BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));

另外,envp是一個(gè)String[],并且String[]中的每一個(gè)元素的形式是:name=value。如:我的Linux系統(tǒng)中沒(méi)有以下環(huán)境變量,但是我把它們寫(xiě)在Java代碼中,作為envp:

val=2
call=Bash Shell

我要調(diào)用的Shell腳本是:/root/experiment/test.sh。

#!/usr/bin/env bash
 
args=1
if [ $# -eq 1 ];then
 args=$1
 echo "The argument is: $args"
fi
 
echo "This is a $call"
start=`date +%s`
sleep 3s
end=`date +%s`
cost=$((($end - $start) * $args * $val))
echo "Cost Time: $cost"

Java調(diào)用代碼是:

private void callScript(String script, String args, String... workspace){
 try {
 String cmd = "sh " + script + " " + args;
//     String[] cmd = {"sh", script, "4"};
 File dir = null;
 if(workspace[0] != null){
  dir = new File(workspace[0]);
  System.out.println(workspace[0]);
 }
 String[] evnp = {"val=2", "call=Bash Shell"};
 process = Runtime.getRuntime().exec(cmd, evnp, dir);
//      process = Runtime.getRuntime().exec(cmd);
 BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));
 String line = "";
 while ((line = input.readLine()) != null) {
  System.out.println(line);
 }
 input.close();
 }
 catch (Exception e){
 e.printStackTrace();
 }
}
 
public static void main(String[] args) {
 // TODO Auto-generated method stub
 CallShell call = new CallShell();
 call.callScript("test.sh", "4", "/root/experiment/");
}

輸出:
/root/experiment/
The argument is: 4
This is a Bash Shell
Cost Time: 24

到此這篇關(guān)于Java調(diào)用Shell命令和腳本的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java調(diào)用Shell命令和腳本內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java發(fā)送http請(qǐng)求的示例(get與post方法請(qǐng)求)

    Java發(fā)送http請(qǐng)求的示例(get與post方法請(qǐng)求)

    這篇文章主要介紹了Java發(fā)送http請(qǐng)求的示例(get與post方法請(qǐng)求),幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2021-01-01
  • Java中的浮點(diǎn)數(shù)分析

    Java中的浮點(diǎn)數(shù)分析

    Java中的浮點(diǎn)數(shù)分析...
    2006-12-12
  • Mybatis-plus:${ew.sqlselect}用法說(shuō)明

    Mybatis-plus:${ew.sqlselect}用法說(shuō)明

    這篇文章主要介紹了Mybatis-plus:${ew.sqlselect}用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java使用Tinify實(shí)現(xiàn)圖片無(wú)損壓縮(4M無(wú)損壓縮到1M)的方法

    Java使用Tinify實(shí)現(xiàn)圖片無(wú)損壓縮(4M無(wú)損壓縮到1M)的方法

    在當(dāng)今的數(shù)字化時(shí)代,圖片已成為網(wǎng)站、應(yīng)用和社交媒體中不可或缺的元素,然而,大尺寸的圖片不僅會(huì)增加頁(yè)面或者客戶端加載時(shí)間,還會(huì)占用大量的存儲(chǔ)空間,本文將詳細(xì)介紹如何利用Tinify壓縮圖片,并將其上傳至OSS,重點(diǎn)介紹圖片壓縮實(shí)現(xiàn)方式,需要的朋友可以參考下
    2024-08-08
  • 基礎(chǔ)不牢,地動(dòng)山搖,Java基礎(chǔ)速來(lái)刷刷

    基礎(chǔ)不牢,地動(dòng)山搖,Java基礎(chǔ)速來(lái)刷刷

    基礎(chǔ)不牢,地動(dòng)山搖,快來(lái)一起學(xué)習(xí)一下基礎(chǔ)吧,不斷地學(xué)習(xí)就算是基礎(chǔ)也會(huì)有新的認(rèn)知和收獲,加油
    2021-08-08
  • SpringBoot如何防止XSS注入攻擊詳解

    SpringBoot如何防止XSS注入攻擊詳解

    這篇文章主要給大家介紹了關(guān)于SpringBoot如何防止XSS注入攻擊的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Java集合系列之ArrayList源碼分析

    Java集合系列之ArrayList源碼分析

    這篇文章主要為大家詳細(xì)介紹了Java集合系列之ArrayList源碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • springcloud檢索中間件?ElasticSearch?分布式場(chǎng)景的使用

    springcloud檢索中間件?ElasticSearch?分布式場(chǎng)景的使用

    單機(jī)的elasticsearch做數(shù)據(jù)存儲(chǔ),必然面臨兩個(gè)問(wèn)題:海量數(shù)據(jù)存儲(chǔ)問(wèn)題、單點(diǎn)故障問(wèn)題,本文重點(diǎn)給大家介紹springcloud檢索中間件?ElasticSearch?分布式場(chǎng)景的運(yùn)用,感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • 通Java接口上傳實(shí)現(xiàn)SMMS圖床

    通Java接口上傳實(shí)現(xiàn)SMMS圖床

    這篇文章主要介紹了通Java接口上傳實(shí)現(xiàn)SMMS圖床,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • MyBatis攔截器原理探究

    MyBatis攔截器原理探究

    MyBatis提供了一種插件(plugin)的功能,雖然叫做插件,但其實(shí)這是攔截器功能.這篇文章主要介紹了MyBatis攔截器原理探究,需要的朋友可以參考下
    2018-02-02

最新評(píng)論