$ ps axo pid,command | sort -n > before
$ sudo reboot
...
$ ps axo pid,command | sort -n > after
$ comm -12 before after | grep -v \\[
comm: file 1 is not in sorted order
comm: file 2 is not in sorted order
PID COMMAND
1 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
745 /usr/lib/systemd/systemd-logind
864 /usr/sbin/NetworkManager --no-daemon
$
如果 init 系统是确定性的,那么由该 init 系统启动的守护程序很可能会在重新启动时以相同的 pid 启动,因为每次启动都会运行相同的代码(尽管偶尔会随机化
fsck
或重新selinux
标记或其他此类不-每次启动代码)。但是,
systemd
在 RHEL7 上不是确定性的:PID 是按顺序分配的,但systemd
可能跨多个内核并行运行任务,可能等待各种硬件或网络服务。让我们看看进程列表之前和之后发生了什么:[
所以这是两个具有相同 PID的进程(除了明显的非随机“PID eins”和标有 的内核线程)。在 30 次重启中记录了几乎相同的信息,它似乎systemd
非常擅长随机化 pid;在这些重新启动期间/usr/lib/systemd/systemd-logind
出现在:数据是使用启动服务捕获的:
那跑了:
一旦系统启动并运行,进程创建顺序将随机化,因为非定时
@reboot
任务触发、用户登录并运行各种不同的命令等。这将取决于系统、在其上创建了多少 PID 等。所以是的,从统计上可以想象,在使用
systemd
. 但是,几率会因系统提供的硬件和具体服务而异。简短的回答
100%
(我并不是说它将是同一个图像,尽管 init 总是 PID=1。只是在进程死亡后,它的 PID 将在某个时候被重用。)
更长的答案
它们可以在重新启动之前重复使用。它们会一直计数,直到使用所有可能的 PID,然后重新开始,避免使用中的 PID。
重新启动时,它们在 1 处重新启动(进程 init 始终为 1)。
这是一个适用于所有 Unix 的通用答案。
有一个 100% 的确定性,给定的 PID 将在重新启动后被重用,但不能保证给定的程序在重新启动后将获得与重新启动前相同的 PID(在大多数情况下,它不会)。
Linux 与其他 UNIX 系统一样,使用一种非常简单的方法来确定新创建的进程具有什么 PID,它只是在用于最后一个未使用的进程启动的 PID 之后按数字顺序获取下一个。当它达到 指定的上限时
/proc/sys/kernel/pid_max
,它又从 1 开始。请注意,此 sysctl 是用户可调的,但从实际角度来看,它只是限制了系统上的进程总数。现在,这条规则有几个特定的例外。在启动时,无论您的系统使用什么
init
(在 RHEL 上默认为 systemd,但您可以在内核命令行上指定任意二进制文件)总是以 PID 1 启动。特别是在 Linux 上,PID 2总是kthreadd
,这是核心内核进程负责启动所有其他内核线程,并且许多很早就启动的内核线程通常在重新启动时也始终具有相同的 PID(例如,PID 4 几乎总是 x86 系统上 CPU 0 的软中断处理程序线程) ,但这取决于系统的硬件配置。