如何使用 Python 自动杀死占用过多内存的进程?

2024-01-10

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

问题:你可以做类似的事情(Python等效)10**(10**10),它消耗的内存远远超过我分配给我的内存。显然,它还会锁定 Apache - 或者需要很长时间才能响应 - 所以我必须重新启动它。

我见过这个问题 https://stackoverflow.com/questions/187804/automatically-kill-process-that-consume-too-much-memory-or-stall-on-linux,但给定的答案使用 Perl,我根本不知道,因此我想要 Python 的答案。操作系统is不过 Linux 也是如此。

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

  1. 自动运行
  2. 强制终止任何超过内存限制(例如 1MB 或 100MB)的进程
  3. 杀死由我的代码生成的任何超过 24 小时的进程

我使用这段代码(在 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()

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


另一种可能有效的方法;使用资源.setrlimit() https://docs.python.org/2/library/resource.html#resource.setrlimit(更多细节在另一个 StackOverflow 答案中 https://stackoverflow.com/questions/2308091/how-to-limit-python-heap-size)。似乎通过这样做,您可以对进程及其子进程设置内存限制;如果达到限制,您必须弄清楚如何处理。我没有使用它的个人经验,但希望这样做可以阻止 Apache 锁定你。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Python 自动杀死占用过多内存的进程? 的相关文章

随机推荐