哪些进程可以在注销 Linux 后继续存在,哪些不能?

哪些进程可以在注销 Linux 后继续存在,哪些不能?

我试图了解当我们注销 Linux(特别是 Ubuntu)时会发生什么:

  • 进程最初如何请求/通知注销进程执行注销(通过发送一些信号,或其他一些IPC方式)?注销过程运行的程序是什么?请求/通知进程通常运行的程序是什么?

  • 注销进程会杀死哪些进程,不会杀死哪些进程? (有一些方法可以让进程在登录后启动并在注销后生存,它们是如何做到这一点的?使进程没有控制终端似乎是一种方法,但大多数进程在下面的注销中被杀死示例没有控制终端)

  • 注销进程如何杀死这些进程(通过发送一些信号,或其他一些IPC方式)?

考虑三种情况:虚拟控制台和桌面环境以及 SSH。 (前两个由操作系统提供,第三个不是,尽管它们都在用户空间中运行)

  1. 当我登录虚拟控制台时,我从登录 shell 中获取以下祖先进程:

    1 systemd
    721 login
    26284 bash
    

    注销后,进程721 login和下面的进程消失。

  2. 在 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及其下面的进程消失。

  3. 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)是如何参与操作系统注销过程的。

以下是我的部分回答:

  1. The loginwait()登录 shell 进程上的进程,并且当登录shell退出时,login将接收SIGCHLD并唤醒以恢复其执行,即也退出。

  2. 看起来注销请求程序例如lxsession-logout 发送SIGTERMlxsession进程 (我说“似乎”是因为我不太明白源代码)。我不知道它的后代如何lxsession反应SIGTERM以及为什么也会死亡,因为我找不到它的配置。我不知道为什么父母lightdm,27302lxsession死了,猜猜父母lightdm,27302可能会 wait()lxsession醒来后死亡

  3. 我不知道退出 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

相关内容