Hudson作业在Runtime.exec挂起

时间:2008-09-26 05:58:49

标签: java hudson runtime.exec

我通过Tomcat运行Hudson作为Windows服务,没有涉及奴隶。作业中的最后一个构建步骤是一个调用某些Java代码的批处理文件。该代码使用PostgreSQL的命令行工具psql(通过Runtime.exec())在本地计算机上创建数据库,并最终针对它运行一些测试。

作业将进展到此时,然后无限期挂起而不开始创建数据库。如果我从命令行运行批处理文件,它可以正常工作。我不认为http://hudson.gotdns.com/wiki/display/HUDSON/Spawning+processes+from+build适用,因为产生的过程似乎甚至没有开始执行,但我是新手,所以如果我错了请告诉我。

编辑@anjanb: 批处理文件的唯一目的是调用Java代码,唯一的用户输入作为命令行参数传入,我可以看到它直接通过构建的控制台输出。

Process Explorer显示正在启动psql,但它显然没有被执行,因为第一个命令psql是创建一个新数据库,但是没有发生。

编辑2:我从Hudson用户邮件列表中得到了一些提示,我将在周一试用它们并报告回来。

编辑3:Java代码已经消耗了输出流,我在开发代码时使用了那篇文章。我无法弄清楚发生了什么,所以我重新开发代码以使用JDBC来创建数据库,而不是依赖于psql和Runtime.exec()

2 个答案:

答案 0 :(得分:3)

您是否阅读过程的输出?如果它产生的输出多于OS缓冲区可以处理的输出,则需要读取它...

此外,某些进程会等到输入完成。尝试在启动进程后调用process.getInputStream()。close()。

也许这篇文章也很有趣。它被称为“当Runtime.exec()不会”: http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=2

答案 1 :(得分:0)

程序可能正在等待某些用户输入。如果服务未配置为接受用户输入,则它将显示为挂起。

您可以尝试将服务配置为允许USER INPUT(GUI) - 这可能有所帮助。

此外,您可以运行Sysinternals ProcessExplorer和ProcessMonitor - 他们将能够找到.BAT作业停止的位置。