簡體   English   中英

從Java代碼運行Shell腳本

[英]Run shell script from java code

我有一個運行bash文件的Java應用程序,並且在bash文件中有運行另一個Java應用程序的代碼,它似乎無法正常工作。我來自c ++,這是一個非常簡單的任務,但我不是真的有Java經驗。 所以,這是我的代碼:

import java.io.IOException;
import java.net.*;
import java.util.Scanner;

public class start {

public void executeScript(){
    try{
        ProcessBuilder pb = new ProcessBuilder("/root/Desktop/chat/script.sh");
        Process p = pb.start();
        p.waitFor();
        System.out.println("Script executed..");
    }catch(Exception e){
        e.printStackTrace();
        }

}

public static void main(String[] args) {
    start st = new start();
    System.out.println("I'm main..");
    st.executeScript();
}

}

這是我的bash文件:

#!/bin/bash
echo "bash started"
java Client ip_address
echo "bash finished"

這是此代碼的結果:

我是主..腳本執行..

我知道不應打印“已執行腳本”,因為我試圖從bash文件運行的java文件是一個無限循環。

注意: If i run the bash file separately in the terminal i get an infinite loop which is the intended result and this is why i know that my mistake is from this file.

我希望我能說清楚一點,否則請詢問更多信息。 謝謝。

另一種方法是使用Runtime.getRuntime() 像這樣

  public void executeScript() throws IOException, InterruptedException {
    Process p = Runtime.getRuntime().exec("sh /root/Desktop/chat/script.sh");
    p.waitFor();

    BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
    BufferedReader errorReader = new BufferedReader(new InputStreamReader(p.getErrorStream()));


    String line = "";
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }

    line = "";
    while ((line = errorReader.readLine()) != null) {
        System.out.println(line);
    }
}

通過以上測試,您無法保證它是否正在運行。 因為很明顯,您告訴您在第二個Java應用程序中正在運行無限循環。 現在,我的建議是將一些System.out.println語句放入該無限循環內,並使用下面的Java代碼執行您的Shell腳本。 output.txt文件中,您可以看到shell腳本以及java程序的輸出,您將知道應用程序是否成功執行。 還要在您的shell腳本中放入一些echo語句。

 String[] command ={"/root/Desktop/chat/script.sh", "command line param if any"};
    ProcessBuilder pb = new ProcessBuilder(command);

    pb.redirectOutput(new File("/tmp/output.txt"));
    String result;
    String overall="";
    try {
        Process p = pb.start();
        p.waitFor();
        BufferedReader br = new BufferedReader(
                new InputStreamReader(p.getInputStream()));
            while ((result = br.readLine()) != null){
                overall = overall + "\n" + result;
            }
            p.destroy();
            System.out.println(result);

    } catch (Exception e) {
        e.printStackTrace();
    }

如果啟動像您編寫Process p = pb.start();那樣的Process p = pb.start(); 它將使java進程再增加一個(通常稱為fork)進程。

  1. 例如,java作為進程“ A”運行
  2. 並且如果進程“ A”開始另一個進程“ B”
  3. 然后它們在同一時間運行。

    (在您的情況下,A是“ JAVA”,B是“ Shell”)

因此,它將是2,並且兩個進程同時(並行)運行,因此您將同時獲得其中兩個結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM