我正在尝试使用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
感谢。
答案 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脚本在一个帐户下工作并不意味着它可以在另一个帐户下工作。你需要测试一下。