2

我正在尝试使用 ProcessBuilder 从运行在 WebSphere Application Server 上的 Servlet 在我的 Linux 服务器上执行 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() 是为了看看我是否会遇到一些我读过其他人提到的缓冲区问题(尽管如果是这种情况,我不希望 .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

谢谢。

4

3 回答 3

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();
}
于 2013-04-08T18:35:31.570 回答
2

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

于 2013-08-30T18:56:49.773 回答
0

该脚本从命令行运行良好,使用与我通过 .start() 传递的相同命令。

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

于 2013-04-06T05:21:02.753 回答