我有一个运行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.
我希望自己清楚,如果没有,请索取更多信息。谢谢。
答案 0 :(得分:1)
另一种方法是使用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);
}
}
答案 1 :(得分:1)
通过上述测试,您无法保证其是否正在运行。因为很明显你告诉你在第二个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();
}
答案 2 :(得分:-1)
如果你开始像你写的那样import { InjectionToken } from "@angular/core";
export let APP_CONFIG = new InjectionToken("app.config");
export interface IAppConfig {
apiEndpoint: string;
}
export const AppConfig: IAppConfig = {
apiEndpoint: "http://88.87.86.999/"
};
它将使(我们通常称fork)从java进程中再生成一个进程。
然后那些正在同时运行。
(在您的情况下,A是' JAVA' B是' Shell')
所以,它将是2.并且2个进程在同一时间(并行)运行,因此您将同时获得其中两个结果。