杀死一个进程和所有后代的安全方法

我使用apparmor , setrlimit , cap_set_rpoc在Linux中创build沙箱环境,让匿名用户在科学应用程序的上下文中基本上执行我的服务器上的一些任意代码。 沙盒中特别允许的一件事是通过分叉和调用可执行文件来启动新进程(尽pipe一个用户的进程总数受RLIMIT_NPROC限制)。

经过一段时间后,比如说1分钟,系统将杀死主进程和所有潜在的subprocess。 我目前正在依靠进程组ID来识别孩子。 然而,从理论上讲,一个subprocess可以调用setpgid来改变它的进程组,所以当我在主进程id(正确的?)上调用kill(-1 * pid)时候,它将不再受到影响。 不幸的是,我没有设置能够阻止进程调用setpgid linux capability

杀死一个进程及其所有(recursion的)subprocess的强大方法是什么?这会使孩子们很难以某种方式“逃避”大屠杀并继续孤儿进程?

如果使用lxc (Linux容器)隔离每个进程树,则可以使用lxc-stoplxc-stop容器中的所有进程。 请参阅lxc手册页的“启动/停止容器”部分。