* nix中的作业pid和进程ID有什么区别?

时间:2015-09-21 20:37:59

标签: process pipe jobs

作业是一个流程管道。执行命令行后,例如sleep 42 &,终端会给我一些这样的信息

[1] 31562

这是31562"工作pid"这份工作?它是否与ls命令的过程相同?

如果我有一个带管道的命令,那么会创建多个进程,作业pid是否与管道第一个进程的进程ID相同?

1 个答案:

答案 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不一定与实时进程相对应。