Linux 进程组/作业/会话
进程组
每个进程除了有一个进程ID之外,还属于一个进程组。进程组是一个或多个进程的集合。通常,它们与同一作业相关联,可以接收来自同一终端的各种信号。每个进程组有一个唯一的进程组ID。每个进程组都可以有一个组长进程。组长进程的标识是,其进程组ID等于其进程ID。
组长进程可以创建一个进程组,创建该组中的进程,然后终止。只要在某个进程组中一个进程存在,则该进程组就存在,这与其组长进程是否终止无关。
‘&’表示将进程放在后台执行
进程:102305 102306 102307
组长:102305
kill -9 102305杀掉组长,进程组还在。如下图:
ps选项:
- a:不仅列当前用户的进程,也列出所有其他用户的进程
- x:表示不仅列有控制端的进程,也列出所有无控制终端的进程
- j:表示列出与作业控制相关的信息
作业
Shell分前后台来控制的不是进程而是作业(Job)或者进程组(Process Group)。一个前台作业可以由多个进程组成,一个后台也可以由多个进程组成,Shell可以运行一个前台作业和任意多个后台作业,这称为作业控制。作业与进程组的区别:如果作业中的某个进程又创建了子进程,则子进程不属于作业。一旦作业运行结束,Shell就把自己提到前台,如果原来的前台进程还存在(如果这个子进程还没终止),它自动变为后台进程组。
会话
会话(Session)是一个或多个进程组的集合。
一个会话可以有一个控制终端。这通常是登陆到其上的终端设备(在终端登陆情况下)或伪终端设备(在网络登陆情况下)。建立与控制终端连接的会话首进程被称为控制进程。一个会话中的几个进程组可被分为一个前台进程组以及一个或多个后台进程组。所以一个会话中,应该包括控制进程(会话首进程),一个前台进程组和任意后台进程组。
SID:会话ID,三个进程都属于同一个进程组,同一个会话。PPID 2449是谁呢?让我们查看一下:
可见,2449是bash,也就是我们的解释器,会话首进程,而且三个进程的父进程都是bash。
多打开几个终端,对比会发现,每打开一个终端,就新建了一个会话。
作业控制有关的信号
- jobs:查看当前作业
- fg:将后台作业放回前台
- bg:将前台作业放置后台并运行
我们先启动几个作业放在后台运行
用fg可以将某个作业提至前台运行,并可以用ctrl+c杀掉。
也可以用fg将会话提至前台,再用ctrl+z使会话停止并放入后台,放入后台的状态是stopped的.
最后可用bg启动