如何使用Python自动终止使用过多内存的进程?

El'*_*man 9 python linux

情况:我有一个网站,允许人们使用共享托管服务器上的Python解释器,以不同的语言(特别是我创建的esolang)执行任意代码.我在一个单独的进程中运行此代码,该进程的时间限制为60秒.

问题:你可以做类似(相当于Python)的东西10**(10**10),它会迅速消耗比我分配给我的更多的内存.显然,它也锁定了Apache - 或者响应时间太长 - 所以我必须重启它.

我已经看到了这个问题,但是给出的答案使用的是Perl,我完全不知道,因此我想在Python中找到答案.不过,操作系统也是 Linux.

具体来说,我想要以下特点:

  1. 自动运行
  2. 强制杀死超过内存限制的任何进程,如1MB或100MB
  3. 杀死我的代码产生的超过24小时的任何进程

我使用这段代码(在Django视图中)来创建进程并运行它(proxy_prgm是一个Manager,所以我可以从解释esolang代码的程序中检索数据):

prgmT[uid] = multiprocessing.Process(
    target = proxy_prgm.runCatch,
    args = (steps,),
    name="program run")

prgmT[uid].start()
prgmT[uid].join(60) #time limit of 1 minute

if prgmT[uid].is_alive():
    prgmT[uid].terminate()
    proxy_prgm.stop()
Run Code Online (Sandbox Code Playgroud)

如果您需要更多详细信息,请不要犹豫,告诉我要编辑什么(或问我问题).

小智 4

另一种可能有效的方法;使用resource.setrlimit()(更多详细信息请参见另一个StackOverflow答案)。似乎通过这样做,您可以对进程及其子进程设置内存限制;如果达到限制,您必须弄清楚如何处理。我没有使用它的个人经验,但希望这样做可以阻止 Apache 锁定你。