SIGKILL前多少时间

时间:2014-12-19 16:43:23

标签: linux sigterm

在尝试发送SIGKILL之前,我试图弄清楚申请退出接收SIGTERM的时间是多少?

我对这些信号的了解非常少。我已经在Stackoverflow的建议答案中阅读了一些内容,但我无法一瞥"大约"在SIGTERminated之前进程可以存活多长时间。

编辑:比如说我创建了一个故意阻止操作系统关闭的问题(也许while(1)可能会这样做吗?)

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

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

1 个答案:

答案 0 :(得分:9)

  

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

不。它不会起作用。除init外,进程可能不会忽略某些信号,如SIGKILL和SIGSTOP 通常,可以在SIGTERM之后立即发送SIGKILL:没有标准延迟让应用程序终止。但是,在没有进一步通知的情况下,在内核执行此操作之前,让这样的应用程序有机会整齐地关闭它是明智的 更多信息here

系统关闭程序有什么问题。实际上,init系统决定了采取行动的方式和时间;操作系统在此操作中帮助init守护进程,但是间接地(传递信号,清理资源等) 所以,事实证明它依赖于实现。分析systemd-217,发送SIGTERM后似乎要等待10秒。

来自main

中的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的子进程。