SRa*_*Raj 0 linux unix operating-systems shell
Linux 守护进程是作为 init 进程的一部分启动的程序。它不与终端关联。
因此,几乎所有启动运行级别 3 的 Linux 系统都会等待用户在终端登录。那么该终端进程是守护进程吗?
另外,如果系统启动到运行级别 5(使用 GUI),我很想认为在这种情况下,shell 不是守护进程。基本上,用户启动终端进程。如果是这种情况,该终端是否与自身关联(意味着同一终端)?
提前致谢。
因此,几乎所有启动运行级别 3 的 Linux 系统都会等待用户在终端登录。那么该终端进程是守护进程吗?
之前在 Linux(和其他 Unix 系统)下终端登录过程的传统方式systemd如下:
init配置为保持一个或多个getty进程运行 - 这意味着当getty进程退出时,init将再次启动它。
每个getty都会打开一个需要有登录提示的设备。这可以是文本模式屏幕上的虚拟 tty/dev/tty0等,也可以是实际的串行端口/dev/ttyS0,如果您仍然愿意,您仍然可以连接经典的真实终端(如 VT220),或者连接调制解调器以实现拨入功能。
getty在被告知打开的设备上输出/etc/issue和提示(通常在行中指定)并等待用户名和密码。[hostname] login:inittab
如果正确,它将通过exec()样式系统调用打开帐户的 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- 这是一个守护进程 - 不过,并没有真正改变终端登录的情况。它基本上取代了终端上的initfor spawning ,但进程仍然以相同的方式处理登录 - 并且当'ed shell 退出时,会触发重新启动新的.gettygettyexecsystemd-logindgetty