甚至有可能知道这一点吗?可能需要执行某种测试才能找到该信息?
我的系统,在我登录后,似乎已经包装了 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 -A
或ps -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 答案中的引用)。