在尝试发送SIGKILL之前,我试图弄清楚申请退出接收SIGTERM的时间是多少?
我对这些信号的了解非常少。我已经在Stackoverflow的建议答案中阅读了一些内容,但我无法一瞥"大约"在SIGTERminated之前进程可以存活多长时间。
编辑:比如说我创建了一个故意阻止操作系统关闭的问题(也许while(1)
可能会这样做吗?)
我正在寻找没有MMI的进程的答案,在标准的Linux发行版上,比如一个内核3.x的Ubuntu。
我的猜测是没有等待时间。如果该过程消失,系统会给它时间来释放其资源。否则,系统会将其杀死。
答案 0 :(得分:9)
比方说,我创建了一个故意阻止的问题 操作系统关闭(可能一段时间(1)可以做到吗?)
不。它不会起作用。除init
外,进程可能不会忽略某些信号,如SIGKILL和SIGSTOP
通常,你可以在SIGTERM之后立即发送SIGKILL:没有标准延迟让应用程序终止。但是,在没有进一步通知的情况下,在内核执行此操作之前,让这样的应用程序有机会整齐地关闭它是明智的
更多信息here。
系统关闭程序有什么问题。实际上,init
系统决定了采取行动的方式和时间;操作系统在此操作中帮助init守护进程,但是间接地(传递信号,清理资源等)
所以,事实证明它依赖于实现。分析systemd-217,发送SIGTERM后似乎要等待10秒。
来自main
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
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的子进程。