为什么当用户注销时运行“ killall init”?


12

在运行Ubuntu 14.XX的多台计算机上,我以用户身份运行命令“ killall init”,并立即注销。我可以再次登录,没有问题。为什么是这样?幕后发生了什么事?

Answers:


21

在较新的Upstart系统上,当您使用GUI登录时,将启动会话初始化过程。由于Ubuntu使用Upstart,因此有一个init会话过程。pstree -ps $$在终端中使用进行测试:

$ pstree -ps $$
init(1)───lightdm(1741)───lightdm(9511)───init(9526)───/usr/bin/termin(9570)─┬─gnome-pty-helpe(9734)                                                                                                                                                                                  
                                                                             └──zsh(7944)

因此,当您运行时killall init,您并没有杀死initPID 1(因为您没有特权),而是杀死了session init,在本例中为PID 9526。

因为这init是GUI会话的管理过程,所以杀死它会杀死您的会话,因此您将注销。


killall是否总是将信号发送到进程树中最接近的亲戚?如果我以root身份运行命令(例如,使用sudo),是否会得到相同的结果,或者出现内核崩溃?
蒂姆·塞吉恩

1
@TimSeguine顾名思义,它将以该名称发送到所有进程。顺便说一句,有些人宁愿pkill而不是killall因为killall在Solaris等其他系统上的工作方式完全不同...
glglgl 2015年

killall杀死所有人。由此得名。
Orion

1
@TimSeguine它可以发送给所有人,但是如果您是普通用户,则无法将信号发送给其他用户的进程。因此,它只影响您自己的进程树中的一个。
Barmar

运行killall initroot似乎不是一个好主意-尤其是在有用的系统-我认为init会导致内核错误,如果它死了,因为它不打算永远到达return它的结束main代码回路。
SlySven
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.