如何检查shell脚本在java中是否成功执行

如何检查shell脚本在java中是否成功执行,java,shell,Java,Shell,我的代码是这样的 脚本“script.sh”需要大约7分钟才能完全执行 private void function(String par1,String par2,String par3,String par4){ String logFile = logFolder + par1 + "_label.log"; String cmd = " /bin/sh " + scriptFolder + "script.sh" + " " +

我的代码是这样的 脚本“script.sh”需要大约7分钟才能完全执行

private void function(String par1,String par2,String par3,String par4){
        String logFile = logFolder + par1 + "_label.log";
        String cmd = " /bin/sh " + scriptFolder + "script.sh" + " " +
                par1 + " "
                + par2 + " "
                + par3 + " "
                + par4 + " > " +
                logFile + " 2>&1 ";
        logger.info("label update script" +cmd);
        /*  vm info */

        String host = ConstantsServers.LABEL_UPDATE_SERVER;
        String user = "USER";
        String passwd = System.getenv("USER_PW");
        /*
         * start the script as user on the server
         */
        new RunCmdViaSSH(host, user, passwd, cmd);
        logger.debug("Log file created at:" +logFile);

    }
此代码执行shell脚本并将输出存储在日志文件中。 如何在java中检查此shell脚本是否成功运行。 请建议

我试着用一个文件读取器检查文件的最后一行,代码如下

try (BufferedReader br = new BufferedReader(new FileReader(file))) {

                            //checks whether the script ran successfully or not
                            String strLine = null,tmp;
                            while ((tmp = br.readLine()) != null) {
                                strLine=tmp;
                            }
                            String lastLine = strLine;
                            logger.debug(lastLine);
                            if (lastLine.contains("script ran successfully")) {
                                  logger.debug("script passed");
                            }
                            else{
                                logger.debug("script failed");
                             }
但这段代码的问题是,它不会等到日志文件完全更新,它只会读取前几行并打印其余部分

还有别的办法吗?
请建议

一种方法是在脚本末尾执行一个
.jar
,在该
.jar
中,您可以检查它是否成功完成,也可以点击URL(如果有)在脚本末尾通知其他组件。取决于您的场景。

处理此问题的最佳方法是使用ProcessBuilder API,它将为您提供对执行的控制。 您可以利用它的流程API等待处理,直到它完成执行,并返回退出代码。(同步处理)

下面是如何使用此API的示例

ProcessBuilder pb = new ProcessBuilder("script.sh", arg1, arg2);
Process p = pb.start();
int exitCode = p.waitFor();
您需要检查进程是否终止,您可以使用
p.waitFor()
执行此操作,直到进程完成。此调用的返回值是您调用的系统命令的返回代码

如果exitCode值为0,则表示已成功执行

最适合您的需要,因为它

如有必要,使当前线程等待进程结束 由此进程对象表示的已终止


您可以通过java建立ssh连接,然后使用此连接执行命令。就像在自己的机器上通过Java运行命令一样,您可以在这个连接上运行命令。这样你就可以使用

Process process = Process.getRuntime().exec(sshCmd);
// you should get error stream and check for errors before waiting
process.getOutputStream().println(yourCmd);
process.waitFor();
// now process is finished and you can get full output from process.getInputstream()
看一看


您可以使用sshpass自动化ssh登录,我认为还有其他一些方法可以做到这一点。在google上搜索“带密码的ssh”。

您可能应该等到
runcmdviash
实际完成。不幸的是,我找不到有关
runcmdviash
的任何信息。但是如何使用此API将shell脚本的输出存储到日志文件中。此链接应该可以帮助您完成此操作