Shell 是守护进程吗?

Shell 是守护进程吗?

Linux 守护进程是作为 init 进程的一部分启动的程序。它与终端无关。

所以几乎所有启动到运行级别 3 的 Linux 系统都会等待用户在终端登录。那么终端进程是守护进程吗?

此外,如果系统启动到运行级别 5(带 GUI),我倾向于认为在这种情况下,shell 不是守护进程。基本上,用户启动终端进程。如果是这样,终端是否与自身相关联(意味着同一个终端)?

提前致谢。

答案1

所以几乎所有启动到运行级别 3 的 Linux 系统都会等待用户在终端登录。那么终端进程是守护进程吗?

以前Linux(以及其他Unix系统)下终端登录过程的传统工作方式systemd如下:

  • init配置为保持一个或多个getty进程运行 - 这意味着当getty进程退出时,init将重新启动它。

  • 每个getty都会打开一个需要登录提示的设备。这可以是文本模式屏幕上的虚拟 tty/dev/tty0等,也可以是实际的串行端口/dev/ttyS0,如果您愿意,您仍然可以连接经典的真实终端(如 VT220),或者连接调制解调器以实现拨入功能。

  • getty在被告知打开的设备上输出/etc/issue和提示(通常在行中指定)并等待用户名和密码。[hostname] login:inittab

  • 如果正确,它将使用exec()style-system 调用打开该帐户的 shell。

  • 什么exec代替使用新的可执行文件来恢复当前进程。由于实际 PID 未发生改变,init因此尚未触发重新启动任何内容。由于 shell 正在运行并已替换getty,因此无法在该终端上进行另一次登录。

  • 当用户完成并关闭 shell 时,init会收到一个信号。 init然后启动一个新的getty,再次要求登录提示。

在这种情况下,getty不是守护进程 - 它是一个非后台程序,等待终端上的输入。您可能没有查看终端,但它仍然在前台等待有人输入用户名和密码。而且 shell 绝对不是守护进程 - 它只是被exec替换了getty,是一个正常的前台程序,就像getty它所取代的一样。

现在 - 大多数 Linux 系统sshd都运行守护进程,其工作方式完全不同。 sshd处理 SSH 协议设置并自行处理该 SSH 连接上的登录提示 - 不getty涉及ssh。但是,当ssh收到有效的用户名/密码时,它会使用不同的系统调用spawn()来创建一个新的子进程。在这种情况下,shell 仍然不是守护进程。

对于图形登录,桌面管理器处理登录;gdm3例如, getty不涉及,因为设置 GUI 会话比仅仅exec设置 shell 更复杂。

systemd-logind- 这是一个守护进程 - 但实际上并没有对终端登录产生太大影响。它基本上取代了在终端上init生成getty,但getty进程仍然以相同的方式处理登录 - 当exec'ed shell 退出时,systemd-logind将触发重新启动新的getty

答案2

登录进程是 init 生成的守护进程。
它在各种 IO 通道(tty、serial、vty 等)上显示登录提示并等待登录。
登录后,它会检查刚刚登录的用户将哪个 shell(或其他程序,不必是 shell)设置为其默认 shell,并将启动该程序,为其提供 IO 通道作为标准输入/输出流。

同样适用于网络登录:在这种情况下,网络服务(大多数情况下为 ssh 或 telnet)会创建一个“虚拟终端,又名 VTY”,然后登录过程会在该终端上处理其余的登录过程和 shell 程序的启动。

对于 GUI,GUI 本身只需启动终端应用程序,然后启动 shell。(在大多数情况下,从 GUI 启动的终端/shell 不需要登录,因为用户已经登录到 GUI。)

因此,“shell”本身不是守护进程,但它通常由守护进程启动。

答案3

Shell 和终端是两个截然不同的组件。终端负责处理按键并在屏幕上绘制内容,而 Shell 负责理解正在输入的命令。

从定义上来说,交互式 shell 绝不是守护进程 — 因为它是交互式的。它附属于您正在输入的终端。

所以几乎所有启动到运行级别 3 的 Linux 系统都会等待用户在终端登录。那么终端进程是守护进程吗?

这个内置终端实际上​​根本没有自己的进程——Linux 虚拟控制台作为内核的一部分运行。(也就是说,文本渲染、键盘输入等都在内核端处理。)

(但是,登录提示并非来自终端本身;它来自盖蒂服务,通过 inittab 或 systemd 作为系统服务启动,但是作为其“控制 tty”附加到终端,因此对于作为守护进程,它有点不确定。)

此外,如果系统启动到运行级别 5(带 GUI),我倾向于认为在这种情况下,shell 不是守护进程。基本上,用户启动终端进程。如果是这样,终端是否与自身相关联(意味着同一个终端)?

不是。图形终端仿真器仅拥有 pty(伪终端)设备的“主”端,但不使用“业务”端,并且才不是将其指定为自己的“控制终端”。

答案4

初始 shell 不是守护进程,因为:

守护进程是一个不与任何东西关联的进程。至少,它应该有自己的会话,不连接到终端,不具有从父进程继承的任何文件描述符,不具有任何打开的文件描述符,没有父进程负责管理它(init 除外),有当前目录,/以免阻止卸载,等等。

由于初始 shell 连接到终端并等待登录,因此它不是守护进程。

相关内容