我想介绍一下最初描述的问题的解决方案这里:
pkill
不是一个原子操作,远远不是一个原子操作。自从 pkill -P 666 foo 确定 pid 667 是名为 foo 的 666 的子代(在 Linux 上,它通过打开和读取 /proc fs 中的多个文件来实现),直到它实际调用kill(2)系统调用时,进程可能已经终止并且其 pid 可能已经被重用。
为了使pkill -P XXX
操作安全(如 SQL 中的事务),我想实现两阶段提交协议:
- 检查该进程是否是
THE_PARENT
进程的子进程。 - 如果“yes”,则将子进程的PID标记为“DO_NOT_REUSE”。
- 检查该进程是否仍然是进程的子进程
THE_PARENT
。 - 如果“是”,则终止子进程(如果仍然可能)。
- 删除
DO_NOT_USE
该 PID 号的标志。
为此,我可以将 PID 号标记为“无法使用”吗?
答案1
内核不会重用 pid,直到它“回绕”为止。
cat /proc/sys/kernel/pid_max
您可以使用(4194304
在我的系统上)检查 pid_max 。
因此,在杀死进程期间,不太可能重用 pid。
/proc/sys/kernel/pid_max (since Linux 2.5.34) This file specifies the value at which PIDs wrap around (i.e., the value in this file is one greater than the maximum PID). PIDs greater than this value are not allocated; thus, the value in this file also acts as a system-wide limit on the total number of processes and threads. The default value for this file, 32768, results in the same range of PIDs as on ear‐ lier kernels. On 32-bit platforms, 32768 is the maximum value for pid_max. On 64-bit systems, pid_max can be set to any value up to 2^22 (PID_MAX_LIMIT, approximately 4 million).