从java代码运行shell脚本

时间:2018-03-29 14:21:53

标签: java bash shell

我有一个运行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.

我希望自己清楚,如果没有,请索取更多信息。谢谢。

3 个答案:

答案 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进程中再生成一个进程。

  1. 例如,java作为进程' A'
  2. 运行
  3. 如果过程' A'开始另一个流程' B'
  4. 然后那些正在同时运行。

    (在您的情况下,A是' JAVA' B是' Shell')

  5. 所以,它将是2.并且2个进程在同一时间(并行)运行,因此您将同时获得其中两个结果。