Linux PID 是如何生成的?
系统解释每个命令后,会建立一个单独的进程来执行该命令。这个新进程会分配一个独特的进程标识号 (PID)。系统使用 PID 来跟踪每个进程的当前状态。
注意 - Linux 命令区分大小写。
进程表
Linux 中的进程表就像几乎所有其他操作系统一样,只是计算机 RAM 中的一种数据结构。它包含有关操作系统当前正在管理的进程的详细信息。
此数据包含有关每个过程的广泛详细信息。
进程ID
进程所有者
进程优先级
每个进程的环境变量
父进程
已用时间
指向进程可执行机器代码的指针
运行以下命令以显示整个屏幕(或终端的完整窗口),其中包含系统当前状态以及使用大部分 CPU 的进程列表。
$ top
输出
top - 13:29:09 up 2 days, 7:13, 4 users, load average: 0.07, 0.02, 0.00 Tasks: 148 total, 1 running, 147 sleeping, 0 stopped, 0 zomb Cpu(s): 0.6%us, 0.5%sy, 0.0%ni, 97.3%id, 1.6%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 4051792k total, 4026104k used, 25688k free, 359168k buffers Swap: 4096492k total, 24296k used, 4072196k free, 2806484k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 7629 greys 20 0 749m 291m 28m S 1 7.4 16:51.40 firefox 19935 greys 20 0 133m 14m 10m S 0 0.4 2:38.52 smplayer 331 root 20 0 4020 880 592 S 0 0.0 0:00.96 init 2 root 15 -5 0 0 0 S 0 0.0 0:00.00 /bin/sh 3 root RT -5 0 0 0 S 0 0.0 0:00.04 migration/0 5494 root 15 -5 0 0 0 S 0 0.0 0:00.90 khelper/0 13 root RT -5 0 0 0 S 0 0.0 0:00.00 kacpid 6 root RT -5 0 0 0 S 0 0.0 0:00.06 kacpi_notify 686 root 15 -5 0 0 0 S 0 0.0 0:01.32 ata/1 368 root RT -5 0 0 0 S 0 0.0 0:00.00 ata/0 21 root 15 -5 0 0 0 S 0 0.0 0:02.14 events/0 10 root 15 -5 0 0 0 S 0 0.0 0:01.44 events/1
这些是默认 top 输出包含的元素。
PID 生成
每个进程都有一个独特的标识符作为其表示,称为进程 ID (pid)。空闲进程及其 pid 号是内核启动的初始进程的名称。init 进程是启动后第一个启动的进程,其 pid 号为 1。
可以通过查阅 /proc/sys/kernel/pid_max 文件来确定系统的限制。
$ cat /proc/sys/kernel/pid_max
输出
420314
然后,我们确定了系统的最高 PID。下一步是启动四个 readlink 进程,每个进程都检查分配给它的新 PID。
largest=0 for pid in /proc/[0-9]*; do pid="${pid##*/}" # Extract PID [ "$pid" -gt "$largest" ] && largest="$pid" # -gt means "greater than" done printf "Largest PID is %d
" "$largest" for _ in $(seq 4); do printf "New process PID %d
" "$(readlink /proc/self)" done
输出
Largest PID is 12648 New process PID 12650 New process PID 12651 New process PID 12652 New process PID 12653
由于 seq 命令固有的启动额外进程的能力,我们可以看到在检查最高 PID 和报告新 PID 之间存在 1 PID 的延迟。
使用 ps 命令
要使用 ps 命令查看正在运行的进程的 PID,可以在终端中执行以下命令。
$ ps aux
输出
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND webmast+ 1 0.0 0.0 1136 0 ? Ss 16:23 0:00 /sbin/docker- webmast+ 7 10.1 0.1 1012 233528 ? Rl 16:23 24:52 GROUND webmast+ 15430 0.0 0.0 2888 908 ? S 16:35 0:00 /bin/sh -c py webmast+ 15431 0.0 0.0 13788 20436 ? Sl 16:35 0:02 python3 main. webmast+ 91894 0.0 0.0 1028 22836 ? S 17:20 0:00 gnuplot webmast+ 91907 0.0 0.0 2888 948 ? S 17:20 0:00 /bin/sh -c oc webmast+ 91908 0.0 0.0 4316732 45844 ? Sl 17:20 0:01 /usr/bin/octa
此命令显示进程列表及其对应的 PID、用户信息、CPU 和内存使用情况以及其他详细信息。
使用 pgrep 命令
当使用特定搜索模式运行 pgrep 命令时,它会扫描正在运行的进程并将它们与提供的条件进行匹配。然后,它返回满足搜索条件的进程的 PID。
以下是如何使用 pgrep 命令查找具有特定名称的进程的示例:
$ pgrep <process_name>
将 <process_name> 替换为要查找的进程的名称。该命令将返回匹配的进程 ID (PID) 列表。
例如,如果要查找名为“python3”的进程的 PID,则运行:
输入
$ pgrep python3
输出
15431 173607 189388
输出将是名称为“python3”的进程的 PID 列表。
结论
在本文中,我们学习了 Linux 进程 ID、什么是进程表,以及 PID 的生成方式。PID 对于管理 Linux 中的进程至关重要。内核使用计数器和基本 PID 值为每个进程生成唯一的 PID。了解 PID 的生成方式对于需要管理和交互 Linux 中的进程的系统管理员和开发者非常重要。