在SIGKILL之前多less次

我试图弄清楚,在发送SIGKILL之前,接收SIGTERM时应用程序退出多less时间?

我对这些信号的知识很低。 我已经阅读了Stackoverflow的build议答案中的一些,但是我不能一瞥“约”一个进程能够在SIGTERminated之前生活多less时间。

编辑:比方说,我创build一个问题,故意阻止操作系统closures(也许一段while(1)可以做到这一点?)

我正在寻找一个没有MMI的进程的答案,在一个标准的Linux发行版上,比如一个带有内核3.x的Ubuntu。

我的猜测是没有等待时间。 如果进程消失,系统会给它时间来释放其资源。 否则,系统杀死它。

比方说,我创建一个问题,故意阻止操作系统关闭(也许一段时间(1)可以做到这一点?)

不。 它不会工作。 一个进程不能忽略一些信号,如SIGKILL和SIGSTOP,除了init
一般来说, 可以在SIGTERM之后立即发送SIGKILL:没有标准的延迟让应用程序终止。 但是,在内核没有进一步通知的情况下,给这样的应用程序提供一个整齐关闭的机会是明智的。
更多信息在这里 。

关系到系统关机过程有一点不同。 事实上, init系统决定如何采取行动,何时采取行动。 操作系统在这个操作中帮助init守护程序,但间接地(传送信号,清理资源等)。
所以,事实证明它是依赖于实现的。 分析systemd-217后,似乎在发送SIGTERM之后等待10秒钟。

从主src / core / shutdown.c

  log_info("Sending SIGTERM to remaining processes..."); broadcast_signal(SIGTERM, true, true); log_info("Sending SIGKILL to remaining processes..."); broadcast_signal(SIGKILL, true, false); 

从broadcast_signal中的src / core / killall.c

 killall(sig, pids, send_sighup); [...] if (wait_for_exit) wait_for_children(pids, &mask); 

继续,在wait_for_children

 until = now(CLOCK_MONOTONIC) + TIMEOUT_USEC; [...] k = sigtimedwait(mask, NULL, &ts); if (k != SIGCHLD) 

TIMEOUT_USER#define TIMEOUT_USEC (10 * USEC_PER_SEC)

正如你所看到的,systemd会等待SIGCHLD,这表明这个孩子已经终止,因为大部分的进程都是systemd的孩子。