哈德森工作挂在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()
解决方案
程序可能正在等待某些用户输入。如果该服务未配置为接受用户输入,则该服务似乎正在挂起。
我们可以通过将服务配置为允许USER INPUT(GUI)进行尝试,这可能会有所帮助。
另外,我们可以运行Sysinternals ProcessExplorer和ProcessMonitor-它们将能够找出.BAT作业已停止的位置。
我们阅读过程的输出了吗?如果产生的输出超出了OS缓冲区的处理能力,则需要阅读...
另外,某些进程会等到输入完成。启动进程后,尝试调用process.getInputStream()。close()。
也许这篇文章也很有趣。它被称为"何时Runtime.exec()不会":
http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=2