我试图了解当我们注销 Linux(特别是 Ubuntu)时会发生什么:
进程最初如何请求/通知注销进程执行注销(通过发送一些信号,或其他一些IPC方式)?注销过程运行的程序是什么?请求/通知进程通常运行的程序是什么?
注销进程会杀死哪些进程,不会杀死哪些进程? (有一些方法可以让进程在登录后启动并在注销后生存,它们是如何做到这一点的?使进程没有控制终端似乎是一种方法,但大多数进程在下面的注销中被杀死示例没有控制终端)
注销进程如何杀死这些进程(通过发送一些信号,或其他一些IPC方式)?
考虑三种情况:虚拟控制台和桌面环境以及 SSH。 (前两个由操作系统提供,第三个不是,尽管它们都在用户空间中运行)
当我登录虚拟控制台时,我从登录 shell 中获取以下祖先进程:
1 systemd 721 login 26284 bash
注销后,进程
721 login
和下面的进程消失。在 Lubuntu 18.04 上,当我登录 lightdm 和 LXDE,并从桌面面板运行 lxterminal 并通过 lxterminal 窗口中的以下命令获取祖先进程时:
$ ps -paus $$ systemd,1 --system --deserialize 19 `-lightdm,661 `-lightdm,27302 --session-child 13 24 `-lxsession,27309,testme -s Lubuntu -e LXDE `-lxpanel,27399 --profile Lubuntu `-lxterminal,27565 `-bash,27568 `-pstree,27594 -paus 27568
当我注销时,进程
lightdm,27302
及其下面的进程消失。ssh 进入 Lubuntu 18.04 后:
$ pstree -a -p -s $$ systemd,1 --system --deserialize 19 └─sshd,669 -D └─sshd,22838 └─sshd,22979 └─bash,22980 └─pstree,30610 -a -p -s 22980
注销后,从
sshd,22838
以下开始的所有进程都消失了。
谢谢。
答案1
我不知道 systemd(尤其是/usr/lib/systemd/systemd-logind
)是如何参与操作系统注销过程的。
以下是我的部分回答:
The login
wait()
登录 shell 进程上的进程,并且当登录shell退出时,login
将接收SIGCHLD
并唤醒以恢复其执行,即也退出。看起来注销请求程序例如
lxsession-logout
发送SIGTERM
到lxsession
进程 (我说“似乎”是因为我不太明白源代码)。我不知道它的后代如何lxsession
反应SIGTERM
以及为什么也会死亡,因为我找不到它的配置。我不知道为什么父母lightdm,27302
也lxsession
死了,猜猜父母lightdm,27302
可能会wait()
在lxsession
醒来后死亡。我不知道退出 SSH 后会发生什么。我猜它类似于 CLI 登录(情况 1),
sshd,22979
可能会等待bash,22980
并死掉。但我真的不知道为什么会有这么多sshd
进程。
答案2
请记住,我不会告诉您所有细节,因为即使我这样做,您也无法理解。我也知道您并不熟悉每个概念,但阅读联机帮助页对您有好处。
进程最初如何请求/通知注销进程执行注销(通过发送一些信号,或其他一些IPC方式)?注销过程运行的程序是什么?请求/通知进程通常运行的程序是什么?
假设您通过“注销进程”来表示“会话管理器”。通过 IPC 与logind
. /usr/lib/systemd/systemd-logind
。任何可以 IPC 的程序logind
。
注销进程会杀死哪些进程,不会杀死哪些进程? (有一些方法可以让进程在登录后启动并在注销后生存,它们是如何做到这一点的?使进程没有控制终端似乎是一种方法,但大多数进程在下面的注销中被杀死示例没有控制终端)
该会话内的进程将被终止,如果这是用户的最后一个会话,并且该用户未启用延迟,则整个用户切片将被销毁。通过不杀死它。几乎与控制终端无关,因为logind
不使用该内核功能。
注销进程如何杀死这些进程(通过发送一些信号,或其他一些IPC方式)?
复杂的逻辑,包括单元文件和信号中的预定义操作。
1,2,3 查看进程树不起作用。logind
不在乎这个。基本上,systemd 风格的服务和会话管理是 cgroup。看systemctl status
。