每个人都知道 PID，究竟什么是 PID？为什么你想要 PID？你打算用 PID 做什么？你脑子里有同样的问题吗？如果是这样，你就找对地方了解这些细节了。我们查询 PID 主要是用来杀死一个没有响应的程序，它类似于 Windows 任务管理器一样。 Linux GUI 也提供相同的功能，但 CLI 是执行 kill 操作的有效方法。什么是进程 ID?PID 代表 进程标识号 process identification ，它在大多数操作系统内核（如 Linux、Unix、macOS 和 Windows）中使用。它是在操作系统中创建时自动分配给每个进程的唯一标识号。一个进程是一个正在运行的程序实例。建议阅读： 如何查看 Apache Web 服务器在 Linux 中的运行时间除了 init 进程外其他所有的进程 ID 每次都会改变，因为 init 始终是系统上的第一个进程，并且是所有其他进程的父进程。它的 PID 是 1。PID 默认的最大值是 32768。可以在你的系统上运行 cat /proc/sys/kernel/pid_max 来验证。在 32 位系统上，32768 是最大值，但是我们可以在 64 位系统上将其设置为最大 2 22（约 4 百万）内的任何值。你可能会问，为什么我们需要这么多的 PID？因为我们不能立即重用 PID，这就是为什么。另外为了防止可能的错误。系统正在运行的进程的 PID 可以通过使用 pidof、pgrep、ps 和 pstree 命令找到。方法 1：使用 pidof 命令pidof 用于查找正在运行的程序的进程 ID。它在标准输出上打印这些 id。为了演示，我们将在 Debian 9（stretch）系统中找出 Apache2 的进程 ID。# pidof apache2 3754 2594 2365 2364 2363 2362 2361 从上面的输出中，你可能会遇到难以识别进程 ID 的问题，因为它通过进程名称显示了所有的 PID（包括父进程和子进程）。因此，我们需要找出父 PID（PPID），这是我们要查找的。它可能是第一个数字。在本例中，它是 3754，并按降序排列。方法 2：使用 pgrep 命令pgrep 遍历当前正在运行的进程，并将符合选择条件的进程 ID 列到标准输出中。# pgrep apache2 2361 2362 2363 2364 2365 2594 3754 这也与上面的输出类似，但是它将结果从小到大排序，这清楚地说明父 PID 是最后一个。在本例中，它是 3754。注意： 如果你有多个进程的进程 ID，那么在使用 pidof 和 pgrep 识别父进程 ID 时就可能不会很顺利。方法 3：使用 pstree 命令pstree 将运行的进程显示为一棵树。树的根是某个 pid，如果省略了 pid 参数，那么就是 init。如果在 pstree 命令中指定了用户名，则显示相应用户拥有的所有进程。pstree 会将相同的分支放在方括号中，并添加重复计数的前缀来可视化地合并到一起。# pstree -p | grep "apache2" |- apache2(3754) -|-apache2(2361) | |-apache2(2362) | |-apache2(2363) | |-apache2(2364) | |-apache2(2365) | `-apache2(2594) 要单独获取父进程，请使用以下格式。# pstree -p | grep "apache2" | head -1 |- apache2(3754) -|-apache2(2361) pstree 命令非常简单，因为它分别隔离了父进程和子进程，但这在使用 pidof 和 pgrep 时命令不容易做到。方法 4：使用 ps 命令ps 显示活动进程的选择信息。它显示进程 ID（pid=PID）、与进程关联的终端（tname=TTY）、以 [DD-]hh:mm:ss 格式（time=TIME）显示的累计 CPU 时间、以及执行名（ucmd = CMD）。输出默认是未排序的。# ps aux | grep "apache2" www-data 2361 0.0 0.4 302652 9732 ? S 06:25 0:00 /usr/sbin/apache2 -k start www-data 2362 0.0 0.4 302652 9732 ? S 06:25 0:00 /usr/sbin/apache2 -k start www-data 2363 0.0 0.4 302652 9732 ? S 06:25 0:00 /usr/sbin/apache2 -k start www-data 2364 0.0 0.4 302652 9732 ? S 06:25 0:00 /usr/sbin/apache2 -k start www-data 2365 0.0 0.4 302652 8400 ? S 06:25 0:00 /usr/sbin/apache2 -k start www-data 2594 0.0 0.4 302652 8400 ? S 06:55 0:00 /usr/sbin/apache2 -k start root 3754 0.0 1.4 302580 29324 ? Ss Dec11 0:23 /usr/sbin/apache2 -k start root 5648 0.0 0.0 12784 940 pts/0 S+ 21:32 0:00 grep apache2 从上面的输出中，我们可以根据进程的启动日期轻松地识别父进程 ID（PPID）。在此例中，apache2 启动于 Dec 11，它是父进程，其他的是子进程。apache2 的 PID 是 3754。via: https://www.2daygeek.com/how-to-check-find-the-process-id-pid-ppid-of-a-running-program-in-linux/作者：Magesh Maruthamuthu 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
提问: 我想要知道运行中脚本子shell的进程id。我该如何在shell脚本中得到PID。当我在执行shell脚本时，它会启动一个叫子shell的进程。作为主shell的子进程，子shell将shell脚本中的命令作为批处理运行（因此称为“批处理进程”）。在某些情况下，你也许想要知道运行中的子shell的PID。这个PID信息可以在不同的情况下使用。比如，你可以使用shell脚本的PID在/tmp下创建一个唯一的临时文件。有时侯脚本需要检测所有运行的进程，它可以从进程列表中排除自身的子shell。在bash中，子shell进程的PID存储在一个特殊的变量‘$$’中。这个变量只读，你不可以在脚本中修改它。比如：#!/bin/bash echo "PID of this script: $$" 上面的脚本会得到下面的输出：PID of this script: 6583 除了$$, bash shell还会导出其他的只读变量。比如，PPID存储子shell父进程的ID（也就是主shell）。UID存储了执行这个脚本的当前用户ID。比如：#!/bin/bash echo "PID of this script: $$" echo "PPID of this script: $PPID" echo "UID of this script: $UID" 输出是：PID of this script: 6686 PPID of this script: 4656 UID of this script: 1000 上面输出中，PID每次执行都会变化。这个因为每次运行都会创建一个新的shell。另一方面，PPID每次都会一样只要你在同一个shell中运行。对于所有bash内置变量列表，参考man页。$ man bash via: http://ask.xmodulo.com/process-id-pid-shell-script.html译者：geekpi 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出