如何确定pid_max包裹了多少次?

如何确定pid_max包裹了多少次?

甚至有可能知道这一点吗?可能需要执行某种测试才能找到该信息?

我的系统,在我登录后,似乎已经包装了 max_pid,所以一个仍然活着的 pid 得到了与旧进程相同的 pid(这搞乱了我的一个脚本......)!我试图了解发生了什么以及是否有一些解决方法......

我的/proc/sys/kernel/pid_max是32768

答案1

无法判断pid_max发生了多少次换行。避免遇到pid_max包装的一种解决方法是增加pid_max内部的价值,

cat /proc/sys/kernel/pid_max

上面的命令会让您知道系统中的最大可用进程数。您可以增加 max_pid 值,如下所示:

echo 4194303 > /proc/sys/kernel/pid_max

甚至,

sysctl -w kernel.pid_max=4194303

但是,您需要调查当前是否有某些进程正在使用内存。

您可以运行ps -Aps -e来查看当前有哪些进程正在使用系统内存。

为什么无法确定包裹?

回答,

大多数系统只是保留最后生成的 PID 的计数,加一(以最大数字换行,例如 65535 或更小一点 - 通常换行发生在 65000 甚至 60000),并检查该数字当前是否未在使用(如果 PID 仍在使用中,则重复 - 因此 PID 1(内核)仍然存在并且不会“重新发布”)。

其他具有安全意识的系统随机生成一个数字并检查它是否未被使用。

在任何给定时间,保证所有 PID 号都是唯一的。

因此,即使pid_max达到了,您仍然可能有一些当前未使用的 pid,因此系统仍然可以使用这些 pid。据我所知,只有当你遇到这样的错误时,你才能知道你的 pid 已经用完了评论说,

如果您的进程数> pid_max,您会收到类似“没有更多进程...

答案2

对于大多数常见情况,此代码可能足够精确:

#!/bin/bash
count=0;pidPrev=0;
while true;do
    echo -n & pidMax=$!;
    if((pidMax<pidPrev));then
        ((count++));
    fi;
    pidPrev=$pidMax;
    echo "$count,$pidMax";
    sleep 1;
done

可能的缺陷:
如果 pidMax 增加到超过 pidPrev,则会失败。
如果睡眠延迟太高,它也可能会失败。
它必须在机器启动时运行,并且不能停止/重新启动,否则计数将失去其意义。

限制:
这个脚本在这里工作,在 Ubuntu 14.04 64 位上,但是通过拉梅什的回答如果分配给新进程的 pid 是随机的,您可能会发现它无法在您的系统上工作。

答案3

有没有一个xy问题这需要在这里解决吗?问题中提到了

一个仍然活着的 pid 得到了与旧进程相同的 pid(这搞乱了我的一个脚本......)

它如何扰乱脚本?是否因为您将进程的 PID 写入文件,但后来发现该进程已完成,现在其他一些脚本引用了“错误”的 PID?

此外,所有 PID 号都是唯一的(请参阅 Ramesh 答案中的引用)。

相关内容