关闭分叉的 JVM
嵌入式关机
测试集完成后,将执行java.lang.System.exit(0)
启动关闭挂钩的过程。此时该进程可能会运行下一个 30 秒,直到所有非守护线程终止。经过一段时间后,该进程将自行终止java.lang.Runtime.halt(0)
。可以通过配置参数自定义 30 秒的超时时间forkedProcessExitTimeoutInSeconds
。
Ping 分叉的 JVM
由于 Surefire 插件 2.20.1 ping 依赖于平台,如果无法识别 Maven 进程或平台的 PID,则会回退到旧机制,因此 Java 中的本机命令会失败。
只需该机制检查它 Maven PID
是否仍然存在,并且操作系统不会在另一个应用程序中重用它。如果 Maven 进程已经死亡,则分叉的 JVM 将被杀死。
实施:取决于 Maven PID
:
- Java 9 调用
ProcessHandle.current().pid()
,或 /proc/self/stat
在 Linux 和/proc/curproc/status
BSD上解析 PID ,或- JMX 调用
ManagementFactory.getRuntimeMXBean().getName()
。
在类 Unix 系统上,进程的正常运行时间由 native command 确定 (/usr)/bin/ps -o etime= -p [PID]
。
在 Windows 上,开始时间是 wmic process where (ProcessId=[PID]) get CreationDate
在分叉的 JVM 中确定的。
自 Surefire Plugin 2.19 起,旧机制明显变慢:
主进程每 10 秒向分叉的 JVM 发送 NOOP 命令。分叉的 JVM 每 20 秒等待一次命令(自 2.20.1 版起更改为 30 秒,请参阅SUREFIRE-1302)。如果主进程被杀死(收到 SIGKILL 信号)或关闭(按 CTRL+C,收到 SIGTERM 信号),则分叉的 JVM 在超时等待期后被杀死。
注意:在版本之后,必须通过将配置参数设置为或3.0.0-M4
来启用此功能。enableProcessChecker
ping
all
通过停止构建来关闭分叉的 JVM
通过发送 SIGTERM 信号或按 CTRL+C 关闭构建的主进程后,主进程立即向每个分叉的 JVM 发送 SHUTDOWN 命令。默认情况下(配置参数shutdown=testset
)分叉的 JVM 不会选择新的测试,这意味着当前的测试可能仍会继续运行。SIGTERM 信号触发在分叉的 JVM 中执行的 Java shutdownhook java.lang.Process.destroy()
(取决于 VM 和 OS,并不总是可靠)。该参数shutdown
可以配置其他两个值exit
和kill
。在主进程收到 SIGTERM 后执行使用exit
分叉的 JVM 。java.lang.System.exit(1)
使用kill
JVM 执行java.lang.Runtime.halt(1)
,例如:
<project> [...] <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.0.0-M5</version> <configuration> <shutdown>kill</shutdown> </configuration> </plugin> </plugins> </build> [...] </project>
注意:在版本之后,必须通过将配置参数设置为or或3.0.0-M4
来启用此功能。enableProcessChecker
ping
native
all
在特定超时后关闭分叉 JVM
forkedProcessTimeoutInSeconds
在每个单独的进程经过一定时间后,使用参数分叉的 JVM 将被单独杀死,并且整个插件失败并显示错误消息:
There was a timeout in the fork
崩溃的分叉 JVM 导致列出崩溃的测试
在 JVM 突然退出后,Crashed tests:
如果整个测试集尚未完成,控制台会列出带有崩溃测试列表的消息。如果测试退出、终止 JVM 或分段错误使 JVM 崩溃,就会发生这种情况。在这种情况下,您可能会对报告目录中生成的转储文件感兴趣,请参阅常见问题解答。