这些过程概念如何关联在一起 - background
、zombie
、daemon
和without controlling terminal
?
我觉得它们在某种程度上很接近,特别是通过 的概念controlling terminal
,但仍然没有太多信息可供我讲述一个故事,就像您需要向正在阅读有关 Linux 的文章的孩子解释一些内容而不撒太多谎一样。
更新#1:例如(我不知道这是不是真的)
background
--zombie
- 前台进程不能成为zombie
,因为它zombie
是一个没有父进程的后台进程daemon
--without ctty
- 所有进程都daemons
在没有 的情况下运行ctty
,但并非所有进程都ctty
没有daemons
background
--daemon
-background process
可以检索a再次交互运行,daemon is not
zombie
--without ctty
-zombie
有ctty
没有附着都无所谓background
--without ctty
-processes
当它们有时发送到后台ctty
,并成为守护进程或死亡,如果ctty
从它们手中夺走的话
答案1
简而言之,加上链接。
僵尸
已退出/终止的进程,但其父进程尚未确认终止(使用系统wait()
调用)。死进程保存在进程表中,以便其父进程可以获知子进程的子进程退出及其退出状态。通常,分叉子进程的程序也会在退出时读取其退出状态,因此只有当父进程停止或有问题时,您才会看到僵尸。
看:
控制终端、会话、前台、后台
这些与终端上运行的 shell 上下文中的作业控制相关。用户登录,启动会话,绑定到终端(控制终端)并启动 shell。然后 shell 运行进程并根据用户的意愿将它们发送到前台和后台(&
启动进程时使用,使用 停止进程^Z
,使用fg
和bg
)。如果从终端读取或写入,后台进程将停止;如果^C
终端上有中断信号,则前台进程会收到中断信号。 (内核的终端驱动程序处理这些信号,shell 控制将哪个进程(组)发送到前台或后台。
看:
守护进程
作为守护进程运行的进程通常不应该绑定到任何特定终端(或登录会话或 shell)。它不应该有控制终端,这样如果终端关闭,它就不会接收到信号,而且通常也不希望它在终端上执行 I/O。从命令行启动守护程序需要断开与终端的所有联系,即启动一个新会话(在上面的作业控制意义上)以摆脱控制终端,并关闭终端的文件句柄。当然,从init
、 systemd 或类似的登录会话之外启动的东西一开始就没有这些联系。
由于守护进程没有控制终端,因此它不受作业控制的约束,并且在作业控制意义上处于“前台”或“后台”并不适用。此外,守护进程通常会重新设置父级,以便init
在退出时清理它们,因此您通常不会将它们视为僵尸。
看:
答案2
僵尸与其他人没有真正的关系;它只是一个已终止的进程,但其父进程尚未读取其退出状态waitpid()
或类似的状态。除非进程有错误或已停止,否则您不应该看到这些。
A守护进程是一个无需控制终端即可运行的程序。通常,当您运行该程序时,它fork()s
本身和父进程都会退出,因此 shell 认为该命令已完成,并且子进程会与终端分离并退出登录会话。由于其父进程退出,其父进程ID变为1,传统上是程序init
,或者现在是systemd
.这个过程确保在孩子死后收割他们,这样你就不会被僵尸淹没。
一个进程可以与一个进程相关联控制终端,这是它通常从中获取输入并将其输出发送到的地方。终端还可以向与其相连的进程发送信号,并将进程组标识为前景组。进程位于前景组允许从终端读取输入,并在按 Ctrl-C 和 Ctrl-Z 时发送 SIGINT 和 SIGSUSP 信号。任何不在其中的进程前景组尝试从终端读取数据的操作被 SIGTSTP 暂停。
shell 为您要求运行的每个管道命令创建不同的进程组,并切换哪个是前景组在前台和后台之间移动作业。当您运行命令时,通常 shell 会创建一个新的进程组并使该组成为前景组。如果你在它后面加上一个后缀,&
那么 shell 就会简单地留下前景组它在哪里,所以新的团体就在后台。按 Ctrl-Z 会将 SIGSUSP 发送到前台组,这会导致大多数命令挂起,但 shell 不会挂起,而是更改了活动命令前景组返回自身,以便它可以提示您输入新命令。
该bg
命令将 SIGCONT 发送到进程组,以便它可以在使用 SIGSUSP 挂起后恢复在后台运行。 fg
改变了前景组到已经在后台运行的现有组之一,将其带到前台。
答案3
好的,这是我的解释,重点是差异这些类型的流程之间(简短但信息丰富):
zombie
- 刚刚退出(完成执行)但在进程表中仍有条目的进程。笔记:僵尸进程仍然有一个家长通常它存在的全部意义是让父进程知道子进程的执行结果(退出代码等)。disowned process
disown
(不控制终端)-由用户显式编辑或设计为与父进程树分离的进程。即使父进程完成执行,它仍然会运行。例如,用户ssh
登录到远程计算机,启动 Web 服务器之类的东西,然后disown
在其上运行并退出ssh
会话。该进程仍将运行,因为它不再是父进程树的一部分。进程也可以被否认运行它nohup
。background process
- 在后台运行 - 不会将输出分割到用户的 tty。要么最终运行&
,要么通过设计将自己分叉到后台。将进程发送到后台的其他选项是启动它并按ctrl+z
。然而,当父进程终止时,在后台运行的子进程也会终止(笔记作者:@psusi - 先前的事实仅适用于用户从终端启动的进程;否则子进程将成为“孤儿”并获得一个 init 进程(pid 1)作为父进程)。daemon
- 与后台进程非常相似。也在后台运行,但很可能是隐式分叉的(根据设计)。通常它静静地坐在后台等待某些事情发生,然后才进行实际工作(传入连接等)。实际上,守护进程可以两者兼而有之不承认的(更有可能)和背景过程取决于它的设计。
希望这个解释有助于区分这些类型的过程。