作业是一个流程管道。执行命令行后,例如sleep 42 &
,终端会给我一些这样的信息
[1] 31562
这是31562
"工作pid"这份工作?它是否与ls
命令的过程相同?
如果我有一个带管道的命令,那么会创建多个进程,作业pid是否与管道第一个进程的进程ID相同?
答案 0 :(得分:1)
作业是一个流程管道。
不一定。虽然大多数情况下作业由进程管道组成,但它可以是单个命令,也可以是由&&
分隔的一组命令。例如,这将创建一个具有多个未通过管道连接的进程的作业:
cat && ps u && ls -l && pwd &
现在,尽管如此,让我们来看看有趣的东西。
这是
31562
这份工作的“工作pid”吗?它与流程是否相同 ls命令?
作业标识符在方括号内给出。在这种情况下,它是1.这是您将用于将其带到前台并执行其他管理任务的ID。这是在shell中识别这个工作的原因。
数字31562
是运行作业的进程组的进程组ID。 UNIX / Linux shell使用进程组:进程组是一组以某种方式相关的进程(通常由线性管道,但如前所述,不一定是这种情况)。在任何时候,您可以拥有0个或更多后台进程组,并且最多只有一个前台进程组(shell控制哪些组在后台,哪个组在前台tcsetpgrp(3)
)。
一组进程由进程组ID标识,进程组ID是进程组负责人的ID。流程组负责人是首先通过调用setpgid(2)
创建并加入该组的流程。执行此操作的确切过程取决于shell的实现方式,但在bash IIRC中,它是管道中的最后一个进程。
在任何情况下,shell显示的是运行作业的进程组的进程组ID(同样,它实际上只是组长的PID)。
请注意,小组长可能在过去已经死亡;进程组ID不会更改。这意味着进程组ID不一定与实时进程相对应。