[英]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)進程。
然后它們在同一時間運行。
(在您的情況下,A是“ JAVA”,B是“ Shell”)
因此,它將是2,並且兩個進程同時(並行)運行,因此您將同時獲得其中兩個結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.