我有一个程序将自己重新定义为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是什么。
答案 0 :(得分:1)
这个问题有点畸形。但您可以使用cgroup来执行此操作。为您的活动创建一个新的cgroup挂载点。这将有一个包含系统中所有进程的“任务”文件。然后,您可以创建此目录的子目录,这将自动获取自己的(空)任务文件。只需将进程的PID写入此新任务文件即可。它及其所有子节点将始终显示在该任务文件中,而不是系统其余部分的文件中。 “逃离”cgroup的唯一方法是对任务文件具有写访问权。
是的,这听起来很复杂,但事实并非如此。这是systemd用于跟踪进程树的机制,可能出于同样的原因:杀死进程中的所有子进程,无论父进程发生了什么。
显然,对你的问题的一个更简单的答案可能是“使用systemd”。