如何防止 Linux 对任何新创建的进程使用特定的 PID 号?

如何防止 Linux 对任何新创建的进程使用特定的 PID 号?

我想介绍一下最初描述的问题的解决方案这里:

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).

相关内容