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


13

我研究大型数据集。测试新软件时,脚本有时会在我身上潜行,迅速获取所有可用的RAM,并使我的桌面无法使用。我想要一种为进程设置RAM限制的方法,这样,如果超出该数量,它将自动被杀死。由于我使用各种不同的工具(R,Perl,Python,Bash等),因此特定于语言的解决方案可能行不通。

那么,是否有某种进程监视器可以让我设置一个阈值RAM并在进程使用更多内存时自动将其终止?



@ Uri:在那个线程中,我只有部分答案(仅用于我问题的cpu部分),而不是最佳答案。他询问内存使用情况。
克里斯金2011年

1
乌里(Uri),在那个线程中完全没有有用的想法。发布链接到它并不是特别有用。
chrisamiller

1
嗯-这个超级用户线程似乎使用ulimit有一个合理的建议:superuser.com/questions/66383/restrict-ram-for-user-or-process
chrisamiller 2011年

Answers:



10

我强烈建议不要这样做。如@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
  2. 现在使其可执行。

    chmod +x killif.sh
    
  3. 现在在终端上运行此脚本。PROCID用实际的进程ID和SIZE以MB为单位的大小替换。

    ./killif.sh PROCID SIZE
    

    例如:

    ./killif.sh 132451 100
    

    如果SIZE为100,则如果其RAM使用量超过100 MB,进程将被杀死。

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


我会考虑在这里少睡一会,例如睡0.5 ...
Denwerko 2011年

@乔治·爱迪生(George Edison),你是怎么做到的。当我尝试粘贴时,它给了我奇怪的格式化文本。Denwerko:您想在哪里睡觉。我已经在while循环中睡了10秒钟
Amey Jah

2
感谢您的解决方案,如下所述,我可能会检查一下。但是,为什么所有关于杀死进程的可怕警告呢?当进程超出其请求的资源量时,群集管理软件(LSF,PBS等)始终会执行此操作,而不会造成严重后果。我同意,对于可能会错误使用它的新用户而言,这不是一个好的解决方案,但是在正确的情况下,这可能会很有用。
chrisamiller

@chrisamiller我已对未来的读者发出警告。就您而言,您知道其中的含义,但是以后的读者可能不知道这些含义。
Amey Jah

2
您能详细说明为什么不这样做吗?
jterm

2

prlimitutil-linux包装中试用该工具。它运行一个有资源限制的程序。它使用prlimit系统调用来设置限制,然后由内核完全强制执行这些限制。

您可以配置16个限制,包括:

  • 最大CPU时间(以秒为单位)
  • 最大用户进程数
  • 最大常驻集大小(“已用内存”)
  • 进程可能锁定到内存的最大大小
  • 虚拟内存的大小
  • 最大打开文件数
  • 文件锁的最大数量
  • 待处理信号的最大数量
  • POSIX消息队列中的最大字节

0

这个数字太大,无法发表评论。我将Amey的原始脚本修改为包含pgrep,因此不必手动输入进程ID,只需按名称排除即可。例如,./killIf.sh chrome 4000杀死所有内存使用量超过4GB的chrome进程。

#!/bin/sh

# $1 is process name
# $2 is memory limit in MB

if [ $# -ne 2 ];
then
    echo "Invalid number of arguments"
    exit 0
fi

while true;
do
    pgrep "$1" | while read -r procId;
    do
        SIZE=$(pmap $procId | grep total | grep -o "[0-9]*")
        SIZE=${SIZE%%K*}
        SIZEMB=$((SIZE/1024))
        echo "Process id = $procId Size = $SIZEMB MB"
        if [ $SIZEMB -gt $2 ]; then
            printf "SIZE has exceeded.\nKilling the process......"
            kill -9 "$procId"
            echo "Killed the process"
            exit 0
        else
            echo "SIZE has not yet exceeding"
        fi
    done

    sleep 1
done

请谨慎选择狭窄的grep字符串和足够大的内存限制,以免不必要地杀死意外的进程。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.