我处理大规模数据集。在测试新软件时,有时会出现一个脚本,它会突然占用所有可用的内存,使我的桌面无法使用。我希望能够设置一个进程的内存限制,如果超过这个限制,它将被自动终止。语言特定的解决方案可能行不通,因为我使用各种不同的工具(R、Perl、Python、Bash等)。
所以,是否有一种进程监视器可以让我设置一个内存阈值,并在使用超过该阈值时自动终止进程?
所以,是否有一种进程监视器可以让我设置一个内存阈值,并在使用超过该阈值时自动终止进程?
killif.sh
:PROCID
,用以MB为单位的大小替换SIZE
。SIZE
为100,则当进程的RAM使用量超过100 MB时,进程将被终止。kill -9
命令。这个内容太长无法放入评论。我修改了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
尝试使用prlimit
工具,它来自于util-linux
软件包。它可以在程序中设置资源限制。它使用prlimit
系统调用来设置这些限制,并由内核纯粹地执行。
您可以配置16个限制,包括: