Linux
在 RHEL7 中是如何分配 PID 的,它們在重啟後會被重用嗎?
如何
PIDs
分配啟動前使用的一個在重新啟動後分配給程序RHEL7?
的機率是多少?
PID
換句話說,從統計學上可以想像,它
RHEL7
會PID
被分配給在機器重新啟動後啟動的程序,這與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
. 但是,機率會因係統提供的硬體和具體服務而異。