微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SIGKILL init进程PID 1

我正在面临一个关于发送信号9(SIGKILL)到init进程(PID 1)的奇怪问题。 正如您所知,SIGKILL不能通过信号处理程序忽略。 当我试图发送SIGKILL到init时,我注意到没有任何事情发生。 init不会被终止。 为了弄清楚这种行为,我决定用strace把自己附加到init进程中,以便更清楚地看到发生的事情。 现在来了怪异的一部分。 如果我用strace“发现”init进程并发送SIGKILL,系统就会崩溃。

我的问题是为什么会发生这种情况? 为什么当我看着这个过程时系统崩溃了,为什么当我不在的时候崩溃呢? 正如我所说的,在这两种情况下,我发送SIGKILL到init。 testingCentOS 6.5,Debian 7和Arch。

谢谢!

在linux上使用信号的IPC

是SIGSEGV交付给每个线程?

在信号处理程序中创build一个线程

考虑进程树的SIGKILL SIGTERM的区别

错误:“struct sigevent”没有成员名为“sigev_notify_thread_id”

收到TERM信号后Java Swing应用程序不会退出

为什么我不能在asyncio事件循环运行时捕获SIGINT?

是否有跨平台的C信号库可用(更好的开源)?

在线程之间发送信号

waitpid阻止时,它不应该

如果init终止,Linux内核会故意强制系统崩溃(请参阅http://lxr.free-electrons.com/source/kernel/exit.c?v=3.12#L501 ,特别是其中的panic调用)。 因此,作为一个安全措施,内核不会向init发送任何致命的信号, SIGKILL也不例外(参见http://lxr.free-electrons.com/ident?v = SIGKILL = SIGIGNAL_UNKILLABLE )(但是,代码流程是错综复杂的,我不知道,但我怀疑内核生成的SIGSEGV或类似的会通过)。

应用ptrace(2) ( strace使用的系统调用)处理1显然禁用了这种保护。 这可以说是内核中的一个bug。 我没有足够的技巧来挖掘代码来发现这个bug。

我不知道其他Unix变体是否将相同的出口崩溃语义或信号保护应用于init 。 如果init终止(至少,如果通过调用_exit ),操作系统将执行干净的关闭或重新启动,而不是一个恐慌是合理的,但据我所知,所有现代的Unix变种都有一个专用的系统调用来请求这个,而不是( reboot(2) )。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐