我遇到了最奇怪的问题:也许有人可以提供帮助。
我有一个用Java编写的守护进程(我在Linux上尝试过最新的Java 8 OpenJDK和Oracle)。它会产生一些进程,并且有一个线程可以监视它们是否完成,同时它将运行其他命令,其中一些可能会杀死进程等。
几乎所有时间都一切都很好。但是,守护程序可以对其子进程执行的操作之一是它可以从中获取核心(不会杀死它们:活动进程的核心)。它通过加载.so并通过JNI调用它来实现这一点,JNI使用ptrace(PTRACE_ATTACH...)
暂停子进程并获取核心信息,然后使用ptrace(PTRACE_DETACH...)
让它再次运行。
这也很好,我可以看到在核心完成后这个过程正常运行,一切都很好。
除此之外,Java的Process
对象现在都很糟糕。每当我在此过程中调用exitValue()
时,我总是返回并退出4991
的代码(如果您对其进行解码,则表示WIFSTOPPED
信号值为19,或SIGSTOP
)。这并不奇怪,因为Linux手册页指出ptrace()将父母视为WIFSTOPPED。但问题是,一旦Process
对象达到此状态,它将永远不会执行任何其他操作,即使该进程实际上在分离后返回运行。
更为关键的是,即使在该过程真正退出后,exitValue()
仍然返回4991,并且该过程未被收获(它仍然存在于Z(僵尸)状态,因为已不存在)并且永远不会消失,直到我的守护进程被杀死,然后init将继承并收获僵尸进程。
我已经查看了isAlive()
的价值(说不),我试图运行waitFor(0, TimeUnit.SECONDS)
(说没有运行),但没有一个得到{{1}出于这种破碎的状态 - 这并不会让我感到惊讶,因为我的阅读建议这些方法实际上是用Process
方法实现的。
在我看来,这就像Java exitValue()
中的一个错误,但我不确定......我已经尝试通过将GDB附加到进程然后将其分离来重现它,但是没有#&# 39; t显示同样的问题。同样地,只使用SIGSTOP / SIGCONT就不会这样做。
任何人都有任何暗示或想法?