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 连接到终端并等待登录,因此它不是守护进程。