我是一名软件开发人员,接触过很多不稳定的软件。最近我做了一个小游戏,由于某种原因导致内存泄漏,直到系统挂起并且没有响应。通常,REISUB 有帮助,但有时甚至没有帮助,您需要进行硬断电。
然后我在另一个程序中再次发生了这种情况,所以我自己想,通过编写一个监视内存使用情况的脚本可以很容易地防止这种情况,如果它在一定时间内超过每个 PID 的特定值,它会收到一个 SIGKILL立即将其取下。
有任何想法吗?谢谢
答案1
请安装earlyoom
并启用此处列出的任何替代方案:
https://github.com/hakavlad/nohang
Fedora 现在默认使用 Earlyoom。
Linux 内核 OOM 处理非常糟糕,如果没有用户空间实用程序/帮助程序,通常无法正常工作。
您还可以使用man limits.conf
cgroup 来限制应用程序 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