java - 在 Tomcat 容器中启动进程时遇到一个奇怪的错误。如何解决?

标签 java windows tomcat batch-file process

我创建了一个 Web 应用程序来管理用户创建的任意作业。一项工作将一些文件复制到另一个文件夹并启动外部程序。外部程序使用批处理文件启动,批处理文件设置一些变量并启动另一个将文件提交到服务器的 Java 程序。我这样启动批处理文件:

final ProcessBuilder pb = new ProcessBuilder("path/to/batch");

pb.directory("parent/folder/of/batch");

final Process p = pb.start();

p.waitFor();

批处理文件包含以下内容:

set CLASSPATH=%CLASSPATH%;<external-program.jar>
set PATH=%PATH%;C:\Program Files\Java\jre7\bin

@echo off
set puser=****
set ppsw=****

java -jar <external-program.jar> %puser% %ppsw%

进程启动但未完成,我的网络应用程序被阻止。如果我手动启动批处理文件,一切都很好。现在真正奇怪的是:如果我聚焦 Tomcat 窗口并使用 Ctrl-C 关闭服务器,该过程将继续工作并以预期结果结束。怎么会这样?

最后的日志是:

[2015-01-14 14:31:39,514]DEBUG   860[main] - org.apache.commons.httpclient.Wire.wire(Wire.java:70) - >> "GET /something HTTP/1.1[\r][\n]"
[2015-01-14 14:31:39,514]DEBUG   860[main] - org.apache.commons.httpclient.Wire.wire(Wire.java:70) - >> "Authorization: Basic ****[\r][\n]"
[2015-01-14 14:31:39,514]DEBUG   860[main] - org.apache.commons.httpclient.Wire.wire(Wire.java:70) - >> "User-Agent: Jakarta Commons-HttpClient/3.1[\r][\n]"
[2015-01-14 14:31:39,514]DEBUG   860[main] - org.apache.commons.httpclient.Wire.wire(Wire.java:70) - >> "Host: some.host[\r][\n]"
[2015-01-14 14:31:39,514]DEBUG   860[main] - org.apache.commons.httpclient.Wire.wire(Wire.java:70) - >> "[\r][\n]"

所以我认为它正在向服务器发出请求然后被阻止。不知何故,servlet 容器在其中发挥了作用。我也尝试使用 Jetty,但问题仍然存在。使用 80 以外的端口也不能解决问题。

我很困惑,如果有人能帮助我,我会很高兴。

附言:我在 Windows 7 x64 上使用 Tomcat 8.0.15。

最佳答案

默认情况下,如果您不重定向任何描述符(stdin、stdout 或 stderr;或者它们在 Windows 上的任何等效项),它们将与创建它们的进程共享它——在您的例子中是 Tomcat。

可能是进程尝试写入 stdout、stderr 或两者,并且它阻止尝试写入它/它们。

尝试重定向到一个文件,例如,因为使用 ProcessBuilder 您可以这样做( stdoutstderr )。

此外,检查 .waitFor() 的返回值:这将是进程的退出值。由于您调用了一个 jar,因此 main() 抛出的任何未捕获的异常都会使进程以代码 1 退出(这就是为什么当您自己编写程序时不应该使用此退出代码!)。

关于java - 在 Tomcat 容器中启动进程时遇到一个奇怪的错误。如何解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27958865/

相关文章:

java - 如何通过跳转复制数组?

java - 为什么类型推断算法会尝试找到最具体的类型?

c# - 与标准 C++ 或 C# 相比,使用 C++/CLI 有什么优势吗?

java.lang.ClassNotFoundException : com. twilio.type.Endpoint tomcat 问题

java - 当 med 从 (ini + end)/2 更改为 ini + (end-ini)/4 时,合并排序算法会发生什么变化?

c - 当设备都具有相同的 deviceID 时,除了枚举之外,还有其他方法可以获取许多 IrDA 设备的套接字吗?

c# - .NET 应用程序将不同的操作系统版本返回到 Windows 10 上的 PowerShell

java - tomcat中web.xml中没有欢迎文件列表怎么办?

java.lang.UnsatisfiedLinkError : org. apache.log4j.nt.NTEventLogAppender.registerEventSource

java - ArrayList<custom-object> 的 Parcelable 实现