进程、进程组、(进程组)会话是Linux的概念。
如果我是正确的,在 bash shell 中,在其中启动的进程组称为作业。
在 bash shell 中启动的所有作业都准确地形成一个会话吗? “准确”的意思是不多也不少。
答案1
不是每个 shell 进程,只有一个登录shell 创建一个新会话(更多详细信息如下)。一开始,会话显然只有一个成员,即 shell 本身。每个新分叉的进程自动属于同一个会话。进程可以通过使用 来创建新会话,从而将自身从会话中删除setsid()
。进程没有其他方法可以更改其会话。
概括:
会话成员 = 登录 shell 以及所有子进程(及其子进程等) 除了创建自己的会话的子进程
剩下的问题是 shell 生成的所有进程是否始终作为“作业”启动,即每个命令一个进程组。虽然这通常是正确的,但我不确定是否适用于非交互式 shell。
更新
这个问题是关于 的bash
,但对于其他类似的具有作业控制的面向命令行的 shell 也可以这样说。
正如 @StéphaneChazelas 指出的,会话是由管理终端或伪终端设备登录的程序创建的。会话与其终端严格相关。
用户必须先登录,然后才能从文件中相应的记录中确定他或她的shell程序passwd
。该 shell 程序被exec
修改 - PID 保持不变。因此,在成为用户登录 shell 的进程内创建了一个会话。