僵尸进程对嵌入式系统的影响 linux
Impact of zombies processes on an embedded linux
我正在开发一个程序(Grand parent process),它会在出现错误时自动重新启动一个进程(parent process),该进程调用另外两个进程(child processes)。
如果其中一个子进程行为不当,父进程会尝试正常关闭应用程序,而祖父进程会重新启动所有内容。但是,如果出现错误或意外行为,祖父进程:
- 杀死父进程(杀死所有子进程)
- 重启父进程
可能由于我的代码中的问题,父进程作为僵尸存活下来,有时我发现我的嵌入式 linux 有 12 或 20 个僵尸。我知道僵尸使用的资源很少(如果我没记错的话:只有它们进入进程 table)。
我的问题是,僵尸数量是否有理论上的限制?
我认为保留 Zombie 进程的唯一负面影响是它们在内核进程 table 中占用 space。您可以保留的最大僵尸数应该是您的内核支持的最大进程数,您可以使用 cat /proc/sys/kernel/pid_max
查询
My question, is there a theoretical limit to zombies number ?
是的。它是内核进程 table 的最大大小。这将因内核而异,并根据 adjustable 内核参数而定,但可能至少有数千个。
但只要我们在这里,让我们解决一些其他问题:
the grand parent process [...] kills the parent process (which kills all the children)
终止进程不会自动终止其 children。它们将由 ID 为 1 的进程继承,如果进程存活时间足够长,您可以在进程列表中观察到。在它们终止后清理它们是进程 1 的职责之一,这可能就是为什么您会有这样的印象,即您正在杀死 grandchildren——您可能没有看到它们作为僵尸留下。
如果你想强行杀死 children 和它们的 parent,那么你应该可以通过将 parent 进程放在它自己的进程组中来实现,并且杀死整个群体。 (你需要一个单独的进程组,这样 grandparent 就不会自杀。)
Due to probably a problem in my code, the parents processes survive as zombies
当进程的 parent 继续到 运行 但在进程终止后不会 wait()
、waitpid()
或 waitid()
时,就会发生这种情况。事实上,这与僵尸进程密切相关:它们确实非常轻,因为它们携带的只是可以通过其中一个函数报告的数据。因此,“生存”并不是一个特别恰当的描述:僵尸进程不再是 运行ning;剩下的就是关于它如何终止的一些数据。
我正在开发一个程序(Grand parent process),它会在出现错误时自动重新启动一个进程(parent process),该进程调用另外两个进程(child processes)。
如果其中一个子进程行为不当,父进程会尝试正常关闭应用程序,而祖父进程会重新启动所有内容。但是,如果出现错误或意外行为,祖父进程:
- 杀死父进程(杀死所有子进程)
- 重启父进程
可能由于我的代码中的问题,父进程作为僵尸存活下来,有时我发现我的嵌入式 linux 有 12 或 20 个僵尸。我知道僵尸使用的资源很少(如果我没记错的话:只有它们进入进程 table)。
我的问题是,僵尸数量是否有理论上的限制?
我认为保留 Zombie 进程的唯一负面影响是它们在内核进程 table 中占用 space。您可以保留的最大僵尸数应该是您的内核支持的最大进程数,您可以使用 cat /proc/sys/kernel/pid_max
My question, is there a theoretical limit to zombies number ?
是的。它是内核进程 table 的最大大小。这将因内核而异,并根据 adjustable 内核参数而定,但可能至少有数千个。
但只要我们在这里,让我们解决一些其他问题:
the grand parent process [...] kills the parent process (which kills all the children)
终止进程不会自动终止其 children。它们将由 ID 为 1 的进程继承,如果进程存活时间足够长,您可以在进程列表中观察到。在它们终止后清理它们是进程 1 的职责之一,这可能就是为什么您会有这样的印象,即您正在杀死 grandchildren——您可能没有看到它们作为僵尸留下。
如果你想强行杀死 children 和它们的 parent,那么你应该可以通过将 parent 进程放在它自己的进程组中来实现,并且杀死整个群体。 (你需要一个单独的进程组,这样 grandparent 就不会自杀。)
Due to probably a problem in my code, the parents processes survive as zombies
当进程的 parent 继续到 运行 但在进程终止后不会 wait()
、waitpid()
或 waitid()
时,就会发生这种情况。事实上,这与僵尸进程密切相关:它们确实非常轻,因为它们携带的只是可以通过其中一个函数报告的数据。因此,“生存”并不是一个特别恰当的描述:僵尸进程不再是 运行ning;剩下的就是关于它如何终止的一些数据。