Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.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
等待一系列脚本中的单个Shell脚本运行到完成,然后继续(Java、MySQL、JUnit)_Java_Mysql_Shell_Junit - Fatal编程技术网

等待一系列脚本中的单个Shell脚本运行到完成,然后继续(Java、MySQL、JUnit)

等待一系列脚本中的单个Shell脚本运行到完成,然后继续(Java、MySQL、JUnit),java,mysql,shell,junit,Java,Mysql,Shell,Junit,我正在开发一个Java程序,它结合了进程和运行时来运行几个shell脚本以进行自动化测试。除一个脚本外,所有脚本都运行良好,这会导致随后的脚本调用出现问题。例: process = runtime.exec("A.sh"); process = runtime.exec("B.sh"); process = runtime.exec("C.sh"); A.sh运行良好,只需几秒钟即可运行。但是,运行B.sh需要几分钟,我认为这会导致运行C.sh时出现问题,因为它们都与同一个MySQL表交互,重

我正在开发一个Java程序,它结合了进程和运行时来运行几个shell脚本以进行自动化测试。除一个脚本外,所有脚本都运行良好,这会导致随后的脚本调用出现问题。例:

process = runtime.exec("A.sh");
process = runtime.exec("B.sh");
process = runtime.exec("C.sh");
A.sh运行良好,只需几秒钟即可运行。但是,运行B.sh需要几分钟,我认为这会导致运行C.sh时出现问题,因为它们都与同一个MySQL表交互,重叠会导致通信链路故障

在不使用不必要的信息使您过载的情况下,我的问题是,在转到下一个exec()调用之前,如何等待以确保运行shell脚本已运行到完成/终止

我所尝试的:

process.waitFor()
这不起作用,我认为它不会等到脚本完全完成

process.wait(long time_period)
这不起作用,因为它会导致当前线程等待,从而导致剩余的shell脚本调用被跳过,并且下一个测试用例过早开始

我调用的导致问题的shell脚本不是一个简单的脚本,但我不是自己编写的,也不了解它在幕后的作用。关于它的唯一相关信息是,它直接连接到所讨论的MySQL数据库,而我的程序使用java.sql.*远程连接(我相信是远程机器上的本地数据库)

编辑:

在遵循一个建议之后,我研究了ApacheCommonsExec并尝试了一个新策略,但没有成功

ExecuteWatchdog watchdog = new ExecuteWatchdog(300000); //For five minutes
CommandLine cmdline = CommandLine.parse("./directory/shell.sh");
DefaultExecutor executor = setExitValue(0);
executor.setWatchdog(watchdog);
int exitVal = executor.execute(cmdLine);
//A line to log the exit val in another file
我的日志并没有暗示shell脚本实际上是运行的,因为日志语句“shell.sh start”和“test 2 start”之间的时间基本上是相同的,这意味着shell.sh运行的~2分钟的过程永远不会发生。我哪里出错了?

我用了。具有同步和异步执行支持。可以设置执行超时

他们教程页面的第一段:

在这一点上,我们可以安全地假设您希望开始一些 在Java应用程序中执行子进程,并且您花费了一些时间 我来这里是为了把它做好。你看着Commons Exec,想“哇- 调用Runtime.exec()很容易,Apache人员正在浪费时间 和我的时间与吨代码”。嗯,我们是通过艰苦的方式学会的 我的案例不止一次)使用plain Runtime.exec()可以 痛苦的经历。因此,我们邀请您深入研究 commons exec并以简单的方式查看困难的教训

高级使用示例(缺少一些代码,如BusinessException和“StreamUtil.closequity”,但可以轻松替换):

ExecuteWatchdog watchdog=新的ExecuteWatchdog(执行超时时间单位:毫秒);
DefaultExecutor executor=新的DefaultExecutor();
执行人。设置看门狗(看门狗);
执行器。setExitValue(0);
ByteArrayOutputStream outputStream=新建ByteArrayOutputStream();
ByteArrayOutputStream errorStream=新建ByteArrayOutputStream();
执行器。setStreamHandler(新的泵流处理器(outputStream,errorStream));
试一试{
log.info(commandLine.toString());
int exitCode=executor.execute(命令行,(映射)null);
如果(exitCode!=0)
抛出新的BusinessException(“进程以非零退出代码退出”);
返回outputStream.toString();
}捕获(执行异常e){
字符串errorStreamStr=null;
if(errorStream.size()!=0)
errorStreamStr=errorStream.toString();
StringBuilder errorMessageBuilder=新建StringBuilder();
errorMessageBuilder.append(“main.error”).append(:\n”).append(
e、 getMessage())。追加(“\n\n”);
如果(errorStreamStr!=null){
errorMessageBuilder.append(“additional.error”).append(“:\n”).append(errorStreamStr.append(“\n\n”);
}
errorMessageBuilder.append(“命令行”).append(:\n”).append(commandLine.toString());
if(log.isDebugEnabled())
log.debug(errorMessageBuilder.toString());
抛出新的BusinessException(errorMessageBuilder.toString());
}捕获(IOE异常){
抛出新的非法状态异常(e);
}最后{
StreamUtil.closequity(outputStream,errorStream);
}

检查shell脚本的退出状态如何?我还没有尝试过,也不知道如何操作,您能推荐一个有助于了解其工作原理的页面吗?无论是教程还是其他,都没有偏好。我指的是Vadim,但我相信Vadim的答案为您的问题提供了更好的解决方案。如果您希望按顺序运行它们,请创建一个新的sh脚本,只需逐个运行。然后从java运行它,我会这样做,但是在它们之间我还需要进行其他文件操作调用。基本上,我可以制作一个sh脚本来处理所有的事情,但是由于后端系统的复杂性,我无法将过程简化那么多。这可能是一个愚蠢的问题,但这在Unix系统中可以工作吗?我只是问,因为我看到很多命令行(我不熟悉)。检查这个。我的代码(基于Commons Exec)经过测试,可以在Windows、MacOS和Enterprise RedHat上运行。所以我尝试了一下,但我觉得我可能会把事情搞砸。我编辑了原始帖子以包含新代码。我发布了带有高级错误处理的代码示例,因为我认为,您的错误消息可以打印到输出或错误流中。谢谢!这真的很有用,并且为我指明了正确的方向。我想我知道该怎么办了。
    ExecuteWatchdog watchdog = new ExecuteWatchdog(EXECUTION_TIMEOUT_IN_MS);
    DefaultExecutor executor = new DefaultExecutor();

    executor.setWatchdog(watchdog);
    executor.setExitValue(0);

    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    ByteArrayOutputStream errorStream = new ByteArrayOutputStream();

    executor.setStreamHandler(new PumpStreamHandler(outputStream, errorStream));

    try {
        log.info(commandLine.toString());

        int exitCode = executor.execute(commandLine, (Map<?, ?>) null);

        if (exitCode != 0)
            throw new BusinessException("Process exited with non-zero exit code.");

        return outputStream.toString();
    } catch (ExecuteException e) {
        String errorStreamStr = null;

        if (errorStream.size() != 0)
            errorStreamStr = errorStream.toString();

        StringBuilder errorMessageBuilder = new StringBuilder();

        errorMessageBuilder.append("main.error").append(":\n").append(
                e.getMessage()).append("\n\n");

        if (errorStreamStr != null) {
            errorMessageBuilder.append("additional.error").append(":\n").append(errorStreamStr).append("\n\n");
        }

        errorMessageBuilder.append("command.line").append(":\n").append(commandLine.toString());

        if (log.isDebugEnabled())
            log.debug(errorMessageBuilder.toString());

        throw new BusinessException(errorMessageBuilder.toString());
    } catch (IOException e) {
        throw new IllegalStateException(e);
    } finally {
        StreamUtil.closeQuietly(outputStream, errorStream);
    }