TranslateProject/published/201802/20171219 4 Easiest Ways To Find Out Process ID (PID) In Linux.md

107 lines
5.0 KiB
Markdown
Raw Normal View History

2018-01-04 09:03:36 +08:00
Linux 中 4 个简单的找出进程 IDPID的方法
======
2018-01-04 09:03:36 +08:00
每个人都知道 PID究竟什么是 PID为什么你想要 PID你打算用 PID 做什么?你脑子里有同样的问题吗?如果是这样,你就找对地方了解这些细节了。
我们查询 PID 主要是用来杀死一个没有响应的程序,它类似于 Windows 任务管理器一样。 Linux GUI 也提供相同的功能,但 CLI 是执行 `kill` 操作的有效方法。
2018-01-04 09:03:36 +08:00
### 什么是进程 ID?
PID 代表<ruby>进程标识号<rt>process identification</rt></ruby>,它在大多数操作系统内核(如 Linux、Unix、macOS 和 Windows中使用。它是在操作系统中创建时自动分配给每个进程的唯一标识号。一个进程是一个正在运行的程序实例。
2018-01-04 09:03:36 +08:00
**建议阅读:** [如何查看 Apache Web 服务器在 Linux 中的运行时间][1]
除了 init 进程外其他所有的进程 ID 每次都会改变,因为 init 始终是系统上的第一个进程,并且是所有其他进程的父进程。它的 PID 是 1。
PID 默认的最大值是 `32768`。可以在你的系统上运行 `cat /proc/sys/kernel/pid_max` 来验证。在 32 位系统上,`32768` 是最大值,但是我们可以在 64 位系统上将其设置为最大 2^22约 4 百万)内的任何值。
2018-01-04 09:03:36 +08:00
你可能会问,为什么我们需要这么多的 PID因为我们不能立即重用 PID这就是为什么。另外为了防止可能的错误。
系统正在运行的进程的 PID 可以通过使用 `pidof`、`pgrep`、`ps` 和 `pstree` 命令找到。
2018-01-04 09:03:36 +08:00
### 方法 1使用 pidof 命令
`pidof` 用于查找正在运行的程序的进程 ID。它在标准输出上打印这些 id。为了演示我们将在 Debian 9stretch系统中找出 Apache2 的进程 ID。
2018-01-04 09:03:36 +08:00
```
# pidof apache2
3754 2594 2365 2364 2363 2362 2361
```
从上面的输出中,你可能会遇到难以识别进程 ID 的问题,因为它通过进程名称显示了所有的 PID包括父进程和子进程。因此我们需要找出父 PIDPPID这是我们要查找的。它可能是第一个数字。在本例中它是 `3754`,并按降序排列。
### 方法 2使用 pgrep 命令
`pgrep` 遍历当前正在运行的进程,并将符合选择条件的进程 ID 列到标准输出中。
2018-01-04 09:03:36 +08:00
```
# pgrep apache2
2361
2362
2363
2364
2365
2594
3754
```
这也与上面的输出类似,但是它将结果从小到大排序,这清楚地说明父 PID 是最后一个。在本例中,它是 `3754`
**注意:** 如果你有多个进程的进程 ID那么在使用 `pidof``pgrep` 识别父进程 ID 时就可能不会很顺利。
2018-01-04 09:03:36 +08:00
### 方法 3使用 pstree 命令
`pstree` 将运行的进程显示为一棵树。树的根是某个 pid如果省略了 pid 参数,那么就是 init。如果在 `pstree` 命令中指定了用户名,则显示相应用户拥有的所有进程。
`pstree` 会将相同的分支放在方括号中,并添加重复计数的前缀来可视化地合并到一起。
2018-01-04 09:03:36 +08:00
```
# pstree -p | grep "apache2"
|- apache2(3754) -|-apache2(2361)
| |-apache2(2362)
| |-apache2(2363)
| |-apache2(2364)
| |-apache2(2365)
| `-apache2(2594)
```
要单独获取父进程,请使用以下格式。
2018-01-04 09:03:36 +08:00
```
# pstree -p | grep "apache2" | head -1
|- apache2(3754) -|-apache2(2361)
```
`pstree` 命令非常简单,因为它分别隔离了父进程和子进程,但这在使用 `pidof``pgrep` 时命令不容易做到。
2018-01-04 09:03:36 +08:00
### 方法 4使用 ps 命令
`ps` 显示活动进程的选择信息。它显示进程 ID`pid`=PID、与进程关联的终端`tname`=TTY、以 `[DD-]hh:mm:ss` 格式(`time`=TIME显示的累计 CPU 时间、以及执行名(`ucmd` = CMD。输出默认是未排序的。
2018-01-04 09:03:36 +08:00
```
# 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
```
从上面的输出中,我们可以根据进程的启动日期轻松地识别父进程 IDPPID。在此例中apache2 启动于 `Dec 11`它是父进程其他的是子进程。apache2 的 PID 是 `3754`
2018-01-04 09:03:36 +08:00
--------------------------------------------------------------------------------
via: https://www.2daygeek.com/how-to-check-find-the-process-id-pid-ppid-of-a-running-program-in-linux/
作者:[Magesh Maruthamuthu][a]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
2018-01-04 09:03:36 +08:00
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.2daygeek.com/author/magesh/
[1]:https://www.2daygeek.com/check-find-apache-httpd-web-server-uptime-linux/