如果超过给定的 RAM 量,则自动终止进程

chr*_*ler 16 memory monitor process

我从事大规模数据集的工作。在测试新软件时,脚本有时会偷偷靠近我,快速获取所有可用 RAM,并使我的桌面无法使用。我想要一种为进程设置 RAM 限制的方法,以便如果它超过该数量,它将被自动终止。特定于语言的解决方案可能不起作用,因为我使用了各种不同的工具(R、Perl、Python、Bash 等)。

那么是否有某种进程监视器可以让我设置 RAM 的阈值量并在使用更多进程时自动终止进程?

Ame*_*Jah 12

我强烈建议不要这样做。正如@chrisamiller 所建议的,设置 ulimit 将限制进程可用的 RAM。

但是,如果您坚持,请遵循此程序。

  1. 将以下脚本另存为killif.sh

    #!/bin/sh
    
    if [ $# -ne 2 ];
    then
        echo "Invalid number of arguments"
        exit 0
    fi
    
    while true;
    do
        SIZE=$(pmap $1|grep total|grep -o "[0-9]*")
        SIZE=${SIZE%%K*}
        SIZEMB=$((SIZE/1024))
        echo "Process id =$1 Size = $SIZEMB MB"
        if [ $SIZEMB -gt $2 ]; then
            printf "SIZE has exceeded.\nKilling the process......"
            kill -9 "$1"
            echo "Killed the process"
            exit 0
        else
            echo "SIZE has not yet exceeding"
        fi
    
        sleep 10
    done
    
    Run Code Online (Sandbox Code Playgroud)
  2. 现在使它可执行。

    chmod +x killif.sh
    
    Run Code Online (Sandbox Code Playgroud)
  3. 现在在终端上运行这个脚本。替换PROCID为实际进程 ID 和SIZE大小(以 MB 为单位)。

    ./killif.sh PROCID SIZE
    
    Run Code Online (Sandbox Code Playgroud)

    例如:

    ./killif.sh 132451 100
    
    Run Code Online (Sandbox Code Playgroud)

    如果SIZE是 100,那么如果其 RAM 使用量超过 100 MB,则进程将被终止。

警告:您知道自己要做什么。杀死进程不是一个好主意。如果该进程有任何关闭或停止命令,则编辑脚本并将kill -9命令替换为该shutdown命令。

  • 感谢您的解决方案,如下所述,我可以检查一下。但是,为什么会出现有关终止进程的所有可怕警告?当进程超过其请求的资源量时,集群管理软件(LSF、PBS 等)会一直执行此操作,而不会产生可怕的后果。我同意这对于可能误用它的新用户来说不是一个好的解决方案,但在适当的情况下,这可能非常有用。 (2认同)
  • 你能详细说明为什么不这样做吗? (2认同)

chr*_*ler 11

我讨厌成为回答自己问题的人,但今天早上我找到了一种替代方法,它包含在一个不错的小实用程序中。它将限制 CPU 时间或内存消耗:

https://github.com/pshved/timeout

我先试一试这个,但赞成 Amey Jah 的好答案。如果这个失败了,我会检查一下。

  • +1 回答您自己的问题 [没问题](http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/)! (5认同)