V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
weiwenhao
V2EX  ›  Linux

关于 Linux 进程 id 有三个小问题

  •  
  •   weiwenhao ·
    weiwenhao · 2022-05-26 11:45:11 +08:00 · 1919 次点击
    这是一个创建于 940 天前的主题,其中的信息可能已经有所发展或是发生改变。
    1. 如果我知道进程组 id, 有什么途径能够获取进程组下的所有 pid? (golang , 不能是 ps -ejf ,linux openwrt 系统上 ps 不支持 ejf)

    2. 我启动了一个 A 进程, pid = 255, pgid(进程组 id) = 255, A 进程启动了 B/C/D 子进程,所有子进程的 pgid 都是 255 。

      • 如果某一时刻 A 进程挂掉了,过了大概 30s 后我检测到 A 进程挂掉,因为我不确定 A 启动的子进程是否都被 linux 系统杀掉,我此时直接执行 kill -9 -255 , 有可能会 kill 错杀掉其他进程组的进程吗?
    3. 基于上面的问题我就很好奇一个问题,进程 id 和进程组 id 以及会话 id 应该是共享一个数字递增池的吧,进程 id 生成的时候回检查进程 id 和进程组 id 是否存在,存在就跳过这个 id?

    6 条回复    2022-05-26 16:17:36 +08:00
    Cyshall
        1
    Cyshall  
       2022-05-26 12:05:37 +08:00
    问题 2:会,只不过几率很小,主要是 Linux 会在进程数量达到最大的时候重复利用之前的进程 ID ,只要重复利用之前的进程 ID ,就存在你说的那种可能,而在 64 位系统下,我记得 Linux 最大进程数量是几百万个。

    问题 3:进程 ID 会一直不断的+1 ,只要拿到进程 ID 就一定表示没有被使用(排除重复利用进程 ID 的情况),所以不存在检不检查进程 ID 。
    codehz
        2
    codehz  
       2022-05-26 13:15:00 +08:00 via Android
    问题 1 自己遍历 /proc/[pid]/stat 里面有 pgid 信息)
    ysc3839
        3
    ysc3839  
       2022-05-26 13:25:56 +08:00 via Android
    1.看支持这个功能的 ps 的代码,自己翻译成 golang
    ch2
        4
    ch2  
       2022-05-26 13:48:33 +08:00 via iPhone   ❤️ 1
    3. 内核会把上一次分配的 pid 保存在 /proc/sys/kernel/ns_last_pid 里(这个文件也是可写的),下一个创建的进程会获得取值+1 的 pid 。如果你在这个文件里指定了一个已经被分配的 pid ,那么内核会尝试依次+1 顺延到找到一个可用的 pid 为止
    weiwenhao
        5
    weiwenhao  
    OP
       2022-05-26 16:12:48 +08:00
    @ch2 有用,学到了
    weiwenhao
        6
    weiwenhao  
    OP
       2022-05-26 16:17:36 +08:00
    @codehz 感谢,终于知道 pgid 存储在哪里了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1608 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 16:40 · PVG 00:40 · LAX 08:40 · JFK 11:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.