This topic created in 1459 days ago, the information mentioned may be changed or developed.
-
如果我知道进程组 id, 有什么途径能够获取进程组下的所有 pid? (golang , 不能是 ps -ejf ,linux openwrt 系统上 ps 不支持 ejf)
-
我启动了一个 A 进程, pid = 255, pgid(进程组 id) = 255, A 进程启动了 B/C/D 子进程,所有子进程的 pgid 都是 255 。
- 如果某一时刻 A 进程挂掉了,过了大概 30s 后我检测到 A 进程挂掉,因为我不确定 A 启动的子进程是否都被 linux 系统杀掉,我此时直接执行 kill -9 -255 , 有可能会 kill 错杀掉其他进程组的进程吗?
-
基于上面的问题我就很好奇一个问题,进程 id 和进程组 id 以及会话 id 应该是共享一个数字递增池的吧,进程 id 生成的时候回检查进程 id 和进程组 id 是否存在,存在就跳过这个 id?
6 replies • 2022-05-26 16:17:36 +08:00
 |
|
1
Cyshall May 26, 2022
问题 2:会,只不过几率很小,主要是 Linux 会在进程数量达到最大的时候重复利用之前的进程 ID ,只要重复利用之前的进程 ID ,就存在你说的那种可能,而在 64 位系统下,我记得 Linux 最大进程数量是几百万个。
问题 3:进程 ID 会一直不断的+1 ,只要拿到进程 ID 就一定表示没有被使用(排除重复利用进程 ID 的情况),所以不存在检不检查进程 ID 。
|
 |
|
2
codehz May 26, 2022 via Android
问题 1 自己遍历 /proc/[pid]/stat 里面有 pgid 信息)
|
 |
|
3
ysc3839 May 26, 2022 via Android
1.看支持这个功能的 ps 的代码,自己翻译成 golang
|
 |
|
4
ch2 May 26, 2022 via iPhone 1
3. 内核会把上一次分配的 pid 保存在 /proc/sys/kernel/ns_last_pid 里(这个文件也是可写的),下一个创建的进程会获得取值+1 的 pid 。如果你在这个文件里指定了一个已经被分配的 pid ,那么内核会尝试依次+1 顺延到找到一个可用的 pid 为止
|