例如bash pid是3000,我想限制子pid在[3001,3010]范围内。
我想要这个,因为我在bash中写了一个无限的while循环,pid会爆炸。
while true;do
something;
sleep 5;
done;
每个循环产生至少3个子进程(true,something,sleep)。所以pid whill以每秒至少3的速度增长。过了一段时间,ps aux会显示一个笨拙的大pid,我认为这不是一件好事。
答案 0 :(得分:2)
PID不会“爆炸”。它们由内核回收。您可以在/ proc / sys / kernel / pid_max中看到最大PID编号。当然,如果您愿意,可以修改此值。
答案 1 :(得分:1)
不,这是完全不可能的,因为当运行fork(2)系统调用时,内核分配了pid。用户级应用程序或库无法更改。事实上,内核在某些时候正在回收pid,如answered by Alex。
如果子进程的pid(fork
)不合适,您可能会立即对exit
和getpid
进行大循环,但这种做法很疯狂,因为你在幸运之前可能需要fork
几千次。
也许namespaces(7)可能是相关的。
答案 2 :(得分:1)
没有理智的方法可以从用户空间那里做到这一点,也没有理智的想法。
如果你确信你必须解决这个问题,并且你拥有something
的来源,那就破解它在迭代之间运行一个sleep
的无限循环。那么你将永远保持相同的PID。
(或者稍微偏离墙壁,破解Bash,以便sleep
和something
也是内置的。为了记录,true
已经是内置的Bash,所以它实际上不会产生子进程。)