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

2022-05-26 11:45:11 +08:00
 weiwenhao
  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?

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

问题 3:进程 ID 会一直不断的+1 ,只要拿到进程 ID 就一定表示没有被使用(排除重复利用进程 ID 的情况),所以不存在检不检查进程 ID 。
codehz
2022-05-26 13:15:00 +08:00
问题 1 自己遍历 /proc/[pid]/stat 里面有 pgid 信息)
ysc3839
2022-05-26 13:25:56 +08:00
1.看支持这个功能的 ps 的代码,自己翻译成 golang
ch2
2022-05-26 13:48:33 +08:00
3. 内核会把上一次分配的 pid 保存在 /proc/sys/kernel/ns_last_pid 里(这个文件也是可写的),下一个创建的进程会获得取值+1 的 pid 。如果你在这个文件里指定了一个已经被分配的 pid ,那么内核会尝试依次+1 顺延到找到一个可用的 pid 为止
weiwenhao
2022-05-26 16:12:48 +08:00
@ch2 有用,学到了
weiwenhao
2022-05-26 16:17:36 +08:00
@codehz 感谢,终于知道 pgid 存储在哪里了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/855403

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX