AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 421058
Accepted
boardrider
boardrider
Asked: 2018-02-01 11:37:03 +0800 CST2018-02-01 11:37:03 +0800 CST 2018-02-01 11:37:03 +0800 CST

在 RHEL7 中是如何分配 PID 的,它们在重启后会被重用吗?

  • 772

如何PIDs分配启动前使用的一个在重新启动后分配给进程RHEL7?
的概率是多少?PID

换句话说,从统计学上可以想象,它RHEL7会PID被分配给在机器重新启动后启动的进程,这与PID重新启动之前使用的进程相同。

编辑:

示例:在重新启动之前,有 PID 544 的守护程序 A,机器重新启动,重新启动后,守护程序 A 启动,并分配 PID 544。

linux rhel
  • 3 3 个回答
  • 1689 Views

3 个回答

  • Voted
  1. Best Answer
    thrig
    2018-02-01T12:17:54+08:002018-02-01T12:17:54+08:00

    如果 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. 但是,几率会因系统提供的硬件和具体服务而异。

    • 2
  2. ctrl-alt-delor
    2018-02-01T11:42:37+08:002018-02-01T11:42:37+08:00

    简短的回答

    100%

    (我并不是说它将是同一个图像,尽管 init 总是 PID=1。只是在进程死亡后,它的 PID 将在某个时候被重用。)

    更长的答案

    它们可以在重新启动之前重复使用。它们会一直计数,直到使用所有可能的 PID,然后重新开始,避免使用中的 PID。

    重新启动时,它们在 1 处重新启动(进程 init 始终为 1)。


    这是一个适用于所有 Unix 的通用答案。

    • 1
  3. Austin Hemmelgarn
    2018-02-01T12:29:10+08:002018-02-01T12:29:10+08:00

    有一个 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 的软中断处理程序线程) ,但这取决于系统的硬件配置。

    • 0

相关问题

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

  • 需要一些系统调用

  • astyle 不会更改源文件格式

  • 通过标签将根文件系统传递给linux内核

  • 在 Gnome3 中禁用窗口的自动最大化

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve