Linux

在 RHEL7 中是如何分配 PID 的,它們在重啟後會被重用嗎?

  • February 1, 2018

如何PIDs分配啟動前使用的一個在重新啟動後分配給程序RHEL7?

的機率是多少?PID

換句話說,從統計學上可以想像,它RHEL7PID被分配給在機器重新啟動後啟動的程序,這與PID重新啟動之前使用的程序相同。

編輯:

*範例:*在重新啟動之前,有 PID 544 的守護程序 A,機器重新啟動,重新啟動後,守護程序 A 啟動,並分配 PID 544。

如果 init 系統是確定性的,那麼由該 init 系統啟動的守護程序很可能會在重新啟動時以相同的 pid 啟動,因為每次啟動都會執行相同的程式碼(儘管偶爾會隨機化fsck或重新selinux標記或其他類似的非-每次啟動程式碼)。

但是,systemd在 RHEL7 上不是確定性的:PID 是按順序分配的,但systemd可能跨多個核心並行執行任務,可能等待各種硬體或網路服務。讓我們看看程序列表之前和之後發生了什麼:

$ 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
$ 

[所以這是兩個具有相同 PID的程序(除了明顯的非隨機“PID eins”和標有 的核心執行緒)。在 30 次重啟中記錄了幾乎相同的資訊,它似乎systemd非常擅長隨機化 pid;在這些重新啟動期間/usr/lib/systemd/systemd-logind出現在:

PID PERCENTAGE
733 5%
734 5%
737 15%
739 5%
743 5%
746 5%
748 5%
749 5%
752 10%
753 10%
755 5%
758 5%
760 5%
764 5%
771 5%
773 5%

數據是使用啟動服務擷取的:

[Unit]
Description=recordpidorder
After=getty.target

[Service]
Type=oneshot
ExecStart=/root/pidandboots

[Install]
WantedBy=multi-user.target

那跑了:

#!/bin/bash
NF=/root/sequence
[[ ! -e "$NF" ]] && echo 0 > "$NF"
CUR=$(( 1 + $(< "$NF") ))
ps haxo pid,command > "/root/pidorder$CUR"
[[ $CUR -gt 30 ]] && mv /root/pidandboots /root/pidandboots.done
echo "$CUR" > "$NF"
reboot

一旦系統啟動並執行,程序創建順序將在非定時@reboot任務觸發、使用者登錄並執行各種不同的命令等時隨機化。這取決於系統、在其上創建了多少 PID 等。

所以是的,從統計上可以想像,在使用systemd. 但是,機率會因係統提供的硬體和具體服務而異。

引用自:https://unix.stackexchange.com/questions/421058