我怎样才能杀死一个将自己重新定义为init的进程?

时间:2013-02-13 22:43:38

标签: ruby linux unix process kill

我有一个程序将自己重新定义为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是什么。

1 个答案:

答案 0 :(得分:1)

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

是的,这听起来很复杂,但事实并非如此。这是systemd用于跟踪进程树的机制,可能出于同样的原因:杀死进程中的所有子进程,无论父进程发生了什么。

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