【问题标题】:unable to call the shell script from java无法从java调用shell脚本
【发布时间】:2015-11-17 07:32:00
【问题描述】:

我正在使用ProcessBuilder 从 Java 调用一个 shell 脚本,但我没有得到任何价值。它显示一个空结果。

这是我的代码:

package webservice;

import java.io.IOException;
import java.io.InputStream;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Response;

@Path("/hello")
public class HelloWorldService {

    @GET
    @Path("/{param}/{param2}/{param3}")
    public Response getMsg(@PathParam("param") String bedroom,@PathParam("param2") String bathroom,@PathParam("param3")String area) throws IOException {
        ProcessBuilder pb = new ProcessBuilder("/script/spark-submit.sh");  
        pb.environment().put("a", bedroom);
        pb.environment().put("b", bathroom);
        pb.environment().put("c", area);
        Process p=pb.start();
        InputStream is = p.getInputStream();
        int i =0;
        StringBuffer sb = new StringBuffer();
        while((i=is.read())!=-1)
            sb.append((char)i);
            System.out.println("value of sb:"+sb.toString());
            String a =sb.toString();
            System.out.println("value of a:"+a);
            String[] arr = a.split(" ");
            if (arr != null) 
            {
                System.out.println("predicted value is " + arr[arr.length - 1]);
            }
            String output = "predicted value is " + arr[arr.length - 1];
            return Response.status(200).entity(output).build();
        }
    }

shell脚本代码

spark-submit --class scalatest.scalatest.scalatest --master local[4] /home/ec2-user/scalatest-0.0.1-SNAPSHOT.jar $a $b $c

【问题讨论】:

  • 你能告诉我 spark-submit.sh 文件的内容吗
  • 你能改变进程构建器调用如下吗?String[] command = {"/bin/bash", "/script/spark-submit.sh"}; ProcessBuilder p = new ProcessBuilder(command);
  • spark-submit --class scalatest.scalatest.scalatest --master local[4] /home/ec2-user/scalatest-0.0.1-SNAPSHOT.jar $a $b $c跨度>

标签: java spring shell hadoop processbuilder


【解决方案1】:

尝试使用

Process p=pb.start();
p.waitFor();

您的流程似乎从未真正开始

【讨论】:

    【解决方案2】:

    尝试使用

    try {
        Runtime rt = Runtime.getRuntime();
        Process p = rt.exec(cmd);
        p.waitFor();
        BufferedReader buff = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line;
        while((line = buff.readLine()) != null){
            temp += line;
        }
        System.out.println(temp);
    } catch (Exception e){
            e.printStackTrace();
    }
    

    【讨论】:

    • 您好,我遇到了进程生成器异常 .error=2 ,没有这样的文件或目录。
    • ProcessBuilder pb = new ProcessBuilder("/script/spark-submit.sh"); pb.environment().put("a", 卧室); pb.environment().put("b", 浴室); pb.environment().put("c", area);字符串临时=空;尝试 { 运行时 rt = Runtime.getRuntime();进程 p = rt.exec(pb.toString()); p.waitFor(); BufferedReader buff = new BufferedReader(new InputStreamReader(p.getInputStream()));字符串线; while((line = buff.readLine()) != null){ temp += line; } System.out.println("temp :"+temp); } 捕捉(异常 e){ e.printStackTrace(); }
    • 尝试提供脚本的完整路径