【问题标题】:Is it possible to limit the pid of child processes in Linux bash?是否可以限制 Linux bash 中子进程的 pid?
【发布时间】:2014-10-23 10:55:04
【问题描述】:

例如 bash pid 为 3000,我想将子 pid 限制在 [3001,3010] 范围内。

我想要这个,因为我在 bash 中编写了一个无限的 while 循环,并且 pid 会爆炸。

while true;do
    something;
    sleep 5;
done;

每个循环至少产生 3 个子进程(true、something、sleep)。所以 pid 会以每秒至少 3 次的速度增长。一段时间后,ps aux 会显示一个笨拙的大pid,我认为这不是一件好事。

【问题讨论】:

  • 为什么您认为“大”PID 不是“好事”? “pid会爆炸”是什么意思?
  • pid 只是一个数字。它由操作系统管理,因此您完全无需担心。
  • 我知道当 pid 超过最大数量时它会回弹,但我无法抗拒尽量不让它发生。
  • 你绝对无法避免pid翻转,无论你做什么,它都会在机器启动足够长的时间后发生。你所说的只是在你给定的范围内强制翻转,这对我来说并不明智。
  • 你为什么问这个问题?请编辑你的问题以改进它!

标签: linux bash pid


【解决方案1】:

PID 不会“爆炸”。它们被内核回收。您可以在 /proc/sys/kernel/pid_max 中看到最大 PID 号。当然,您可以根据需要修改此值。

【讨论】:

    【解决方案2】:

    不,这完全不可能,因为 pid 是由 kernel 在运行 fork(2) 系统调用时分配的。用户级应用程序或库无法改变这一点。事实上,内核有时会回收 pid,如 answered by Alex

    如果子进程的 pid(带有getpid)不合适,您可能会立即对forkexit 执行一个大循环,但这种方法很疯狂,因为您可能需要fork几千次才幸运。

    也许namespaces(7) 可能是相关的。

    【讨论】:

      【解决方案3】:

      从用户空间没有理智的方法可以做到这一点,也没有理智的理由想要这样做。

      如果你确信你必须解决这个问题,并且你有 something 的源代码,请破解它以在迭代之间运行带有 sleep 的无限循环。那么你将永远停留在同一个 PID 中。

      (或者稍微离墙一点,破解 Bash 以便 sleepsomething 也是内置的。为了记录,true 已经是 Bash 内置的,所以它实际上不会产生一个子进程。)

      【讨论】:

        猜你喜欢
        • 2010-09-16
        • 2018-07-05
        • 2022-07-18
        • 2015-12-23
        • 1970-01-01
        • 2021-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多