如果在给定时间内占用超过 xGiB 的 RAM,则终止进程

如果在给定时间内占用超过 xGiB 的 RAM,则终止进程

我是一名软件开发人员,接触过很多不稳定的软件。最近我做了一个小游戏,由于某种原因导致内存泄漏,直到系统挂起并且没有响应。通常,REISUB 有帮助,但有时甚至没有帮助,您需要进行硬断电。

然后我在另一个程序中再次发生了这种情况,所以我自己想,通过编写一个监视内存使用情况的脚本可以很容易地防止这种情况,如果它在一定时间内超过每个 PID 的特定值,它会收到一个 SIGKILL立即将其取下。

有任何想法吗?谢谢

答案1

请安装earlyoom并启用此处列出的任何替代方案:

https://github.com/hakavlad/nohang

Fedora 现在默认使用 Earlyoom。

Linux 内核 OOM 处理非常糟糕,如果没有用户空间实用程序/帮助程序,通常无法正常工作。

您还可以使用man limits.confcgroup 来限制应用程序 RAM 使用。

答案2

简单的想法:检查内存是否超过给定值,并在一段时间后再次检查。出击,连续三击就会导致死亡。需要知道:进程的PID

#!/bin/bash
pid=$1
strike=0

#as long as process exists
while (kill -0 $pid 2>/dev/null) ; do
  #get RAM usage in kB
  ram=$(pmap -x $pid | tail -1 | awk '{print $3}')
  #compare to threshold, 1,000,000kB
  if [[ 1000000 -lt $ram ]] ; then
    strike=$((strike+1))
    if [[ strike -eq 3 ]] ; then
       kill $pid
       exit
    fi
  else
    strike=0
  fi
  sleep 5
done

相关内容