0

我有一个程序将自身重新设置为 init,所以我不能使用以下代码:

pid=Process.spawn("xxx")
Process.wait(pid) #started xxx with pid, 
                  #but it respawned itself to 
                  #pid2 which has the ppid set to 1

我不确定是否有办法追踪什么是新的 pid。

4

1 回答 1

1

这个问题有点畸形。但是您可以使用 cgroups 来执行此操作。为您的活动创建一个新的 cgroup 挂载点。这将有一个包含系统中所有进程的“任务”文件。然后你可以创建这个目录的子目录,它会自动得到自己的(空的)任务文件。只需将进程的 PID 写入此新任务文件即可。它及其所有子项将始终出现在该任务文件中,而不是系统其余部分的文件中。“逃避” cgroup 的唯一方法是拥有对任务文件的写访问权。

是的,这听起来很复杂,但事实并非如此。这是 systemd 用来跟踪进程树的机制,可能与您想要的原因相同:杀死进程的所有子进程,不管它们的父进程发生了什么。

显然,对您的问题的一个更简单的答案可能是“使用 systemd”。

于 2013-02-13T22:48:38.430 回答