我想知道当一个进程收到 SIGTERM 并且它产生了子进程(例如运行 /bin/sh 命令的 JVM)时会发生什么。
是否存在某种自动性,或者父进程只是退出,然后子进程也收到 SIGTERM 信号?他们终止吗?
答案1
当 Linux 进程收到 SIGTERM 时会发生什么(以及子进程可能会发生什么)完全取决于程序员的意愿。
可以简单地指示该进程忽略(并像往常一样继续其业务),突然死亡,使其子进程成为孤立的,或者执行一些进程内构建的代码(相关的软件中断处理程序),这些代码最终可以将信号传播到儿童进程或更加小心。
Java 虚拟机有其自身的特殊性,这使得它不能作为......范例…;-)
信号术语?直接无视(好了 !感谢XRS 额外选项,其他代码会更合适地处理。
嵌入 JVM 的应用程序经常需要捕获 SIGINT 或 SIGTERM 等信号,这可能会导致对 JVM 信号处理程序的干扰。 -Xrs 选项可用于解决此问题。使用 -Xrs 时,JVM 不会更改 SIGINT、SIGTERM、SIGHUP 和 SIGQUIT 的信号掩码,并且不会安装这些信号的信号处理程序。
无论什么孩子都会发生什么?嗯……这一切都取决于嵌入应用程序。
信号术语?只是……优雅地关闭!
任何 Java 程序都可以附加关闭钩子到机器。即 JVM 在宕机之前应该执行的代码。就像这样简单的事情:
public class ShutDownHook
{
public static void main(String[] args)
{
Runtime.getRuntime().addShutdownHook(new Thread()
{
public void run()
{
System.out.println("Shutdown Hook is running !");
}
});
System.out.println("Application Terminating ...");
}
}
这使得开发人员能够随意终止任何子进程,甚至让其中一些子进程由于机器停机而突然死亡。
JVM(以及一般的 VM)与标准 Linux 进程有很大不同,因为某些信号(特别是 SIGTERM)的处理可能是在虚拟机内部信号处理程序之外进行编码(和定制)的。即使虚拟机死机,这也使得该代码能够运行。