我正在Linux中使用apparmor,setrlimit,cap_set_rpoc创建一个沙箱环境,让匿名用户在科学应用程序的上下文中基本上在我的服务器上执行一些任意代码。沙盒中特别允许的一件事是通过分叉和调用可执行文件来启动新进程(尽管一个用户的进程总数受RLIMIT_NPROC
限制。)
在给定的时间段后,比如1分钟,系统将杀死主进程和所有潜在的子进程。我目前依靠进程组ID来识别孩子。但是,从理论上讲,子进程可以调用setpgid
来更改其进程组,这样当我在主进程ID上调用kill(-1 * pid)
时它就不再受影响了(正确吗?)。不幸的是,我没有设置linux capability
来阻止进程调用setpgid
。
杀死一个进程及其所有(递归)孩子的强大方法是什么,这会让孩子们很难以某种方式“逃离”大屠杀并继续作为孤儿进程?
答案 0 :(得分:1)
如果使用lxc(Linux容器)隔离每个进程树,则可以使用lxc-stop
来终止容器中的所有进程。请参阅lxc manual page的“启动/停止容器”部分。