我有一个java应用程序,它正在分叉子JVM来执行一些操作。子进程看起来和父进程一样,包括所有参数。
为了确认父节点,我验证了父节点Id,并且它始终是原始的JVM。
应用程序作为普通java进程运行,即不在任何服务器上,如apache, weblogic等。由于进程具有相同的参数,因此它们都写入相同的日志文件,并且打开的文件也相同。
这是以前不存在的新行为。有没有人能提供一些线索,告诉我要检查什么才能找到原因?
JVM版本:- OpenJDK Runtime Environment (IcedTea 2.5.6) (7u79-2.5.6-0ubuntu1.14.04.1)操作系统:Ubuntu 14.04
一种可能是显式调用Runtime
exec
方法。
类似如下:
Process process = Runtime.getRuntime ().exec("java -jar myApp.jar");
这将创建主进程的新进程子进程。
这可以显式地完成(使用前面的代码)或隐式地调用一些外部库,例如根据某些配置文件启动新进程。
我们通过Processbuilder调用tar,它在forkAndExec上挂起了。Fork是成功的,所以可以看到java进程,但不能看到exec。由于大量的磁盘操作,它在关闭系统调用时挂起。