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

时间:2015-12-01 06:38:09

标签: python linux

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

问题:您可以执行类似(Python等效)10**(10**10)之类的操作,这会快速消耗比我分配给我的更多内存。显然,它也会锁定Apache - 或者响应时间太长 - 所以我必须重启它。

我见过this question,但给出的答案使用的是Perl,我完全不知道,因此我想在Python中找到答案。但是OS 也是 Linux。

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

  1. 自动运行
  2. 强制执行任何超出内存限制的进程,如1MB或100MB
  3. 杀死由我的代码生成的超过24小时的任何进程
  4. 我使用这段代码(在Django视图中)来创建进程并运行它(proxy_prgm是一个管理器,所以我可以从程序中检索解释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()
    

    如果您需要更多详细信息,请不要犹豫,告诉我要编辑的内容(或向我提问)。

1 个答案:

答案 0 :(得分:4)

另一种可行的方法;使用resource.setrlimit()(更多详情in this other StackOverflow answer)。看来,通过这样做,您可以为进程及其子进程设置内存限制;如果达到限制,你将不得不弄清楚如何处理。我没有使用它的个人经验,但希望这样做会阻止Apache锁定你。