ProcessBuilder.start()返回0但不执行shell脚本

时间:2013-04-06 05:08:05

标签: shell servlets processbuilder

我正在尝试使用ProcessBuilder在我的Linux服务器上从WebSphere Application Server上运行的Servlet执行shell脚本。

代码返回0(使用.waitFor()),但脚本似乎没有执行。 如果我将无效路径放到脚本中,我会收到“找不到文件”的异常,所以我知道它找到了脚本......但似乎没有执行。

脚本本身调用另一个脚本,该脚本应该最终输出一个zip文件(我还有一个“触摸”行,看看那里发生了什么......但没有做任何事情。)

脚本在命令行运行正常,使用与我传递的相同命令.start()。

这是我的Servlet的片段:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    System.out.println("in doPost");


    System.out.println("about to kick off ProcessBuilder");
    ProcessBuilder pb = new ProcessBuilder("/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/installedApps/localhostNode01Cell/Svc_war.ear/Svc.war/test.sh");
    pb.redirectErrorStream(true);
    Process process = pb.start();
    BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
    int ch;
    while ((ch = br.read()) != -1)
        System.out.println((char)ch);
    br.close();
    try {
        int exitVal = process.waitFor();
        System.out.println("Exit Value: " + exitVal);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

.redirectErrorStream()和.getInputStream()是否要查看我读过其他人引用的一些Buffer问题(虽然我不希望.waitFor()返回0,如果那是情况)。

这是我第一次涉足ProcessBuilder,所以我希望我能错过一些明显的东西。

任何想法/提示都将不胜感激。

哦,是的......这是我得到的输出:

[4/5/13 21:32:41:791 PDT] 0000004d SystemOut     O in doPost
[4/5/13 21:32:41:791 PDT] 0000004d SystemOut     O about to kick off ProcessBuilder
[4/5/13 21:32:41:818 PDT] 0000004d SystemOut     O Exit Value: 0

感谢。

3 个答案:

答案 0 :(得分:2)

搞定了....我需要使用以下方式设置工作目录:

pb.directory(new File("/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/installedApps/localhostNode01Cell/Svc_war.ear/Svc.war/"));

所以最终解决方案如下:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

System.out.println("in doPost");


System.out.println("about to kick off ProcessBuilder");
ProcessBuilder pb = new ProcessBuilder("/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/installedApps/localhostNode01Cell/Svc_war.ear/Svc.war/test.sh");
pb.redirectErrorStream(true);
pb.directory(new File("/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/installedApps/localhostNode01Cell/Svc_war.ear/Svc.war/"));
Process process = pb.start();
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
int ch;
while ((ch = br.read()) != -1)
    System.out.println((char)ch);
br.close();
try {
    int exitVal = process.waitFor();
    System.out.println("Exit Value: " + exitVal);
} catch (InterruptedException e) {
    e.printStackTrace();
}

答案 1 :(得分:2)

您只需将shell脚本放在工作目录中即可。在这样做时,您不需要通过执行pb.directory(“目录”)来设置ProcessBuilder的目录

答案 2 :(得分:0)

  

脚本在命令行运行正常,使用与我传递的相同命令.start()。

我敢打赌,问题在于,当您从命令行进行测试时,您是在一个用户帐户下进行测试,而WebSphere则在另一个帐户下运行它。这两个帐户可以具有不同的访问权限,不同的$PATH设置等。事实上,shell脚本在一个帐户下工作并不意味着它可以在另一个帐户下工作。你需要测试一下。