Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ProcessBuilder.start()返回0,但不返回';不执行shell脚本_Shell_Servlets_Processbuilder - Fatal编程技术网

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

ProcessBuilder.start()返回0,但不返回';不执行shell脚本,shell,servlets,processbuilder,Shell,Servlets,Processbuilder,我试图使用ProcessBuilder在我的Linux服务器上执行一个shell脚本,该脚本来自运行在WebSphereApplicationServer上的Servlet 代码返回0(使用.waitFor()),但脚本似乎没有执行。 如果我给脚本添加了一个无效路径,我会得到一个“未找到文件”异常,因此我知道它正在查找脚本…但似乎没有执行 该脚本本身调用另一个脚本,该脚本最终将输出一个zip文件(我还有一个“触摸”行,以查看其中是否发生了任何事情……但没有任何操作) 脚本在命令行中运行良好,使用

我试图使用ProcessBuilder在我的Linux服务器上执行一个shell脚本,该脚本来自运行在WebSphereApplicationServer上的Servlet

代码返回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
谢谢

脚本在命令行中运行良好,使用的命令与我用.start()传递的命令相同

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

脚本在命令行中运行良好,使用的命令与我用.start()传递的命令相同


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

使其正常工作……我需要使用以下命令设置工作目录:

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();
}

我需要使用以下命令设置工作目录:

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();
}

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

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

来设置ProcessBuilder的目录。对不起,我没有提到,我当前在命令行(root)测试的同一帐户下运行WebSphere。对不起,我没有提到,我当前在命令行(root)测试的同一帐户下运行WebSphere。