我研究大型数据集。测试新软件时,脚本有时会在我身上潜行,迅速获取所有可用的RAM,并使我的桌面无法使用。我想要一种为进程设置RAM限制的方法,这样,如果超出该数量,它将自动被杀死。由于我使用各种不同的工具(R,Perl,Python,Bash等),因此特定于语言的解决方案可能行不通。
那么,是否有某种进程监视器可以让我设置一个阈值RAM并在进程使用更多内存时自动将其终止?
我研究大型数据集。测试新软件时,脚本有时会在我身上潜行,迅速获取所有可用的RAM,并使我的桌面无法使用。我想要一种为进程设置RAM限制的方法,这样,如果超出该数量,它将自动被杀死。由于我使用各种不同的工具(R,Perl,Python,Bash等),因此特定于语言的解决方案可能行不通。
那么,是否有某种进程监视器可以让我设置一个阈值RAM并在进程使用更多内存时自动将其终止?
Answers:
我不希望自己回答自己的问题,但是今天早晨,我找到了另一种方法,包装在一个不错的小工具中。它将限制CPU时间或内存消耗:
https://github.com/pshved/timeout
我先给这个镜头一个镜头,但投票给Amey Jah一个不错的答案。我会检查一下这是否使我失败。
我强烈建议不要这样做。如@chrisamiller所建议,设置ulimit将限制进程可用的RAM。
但是,如果您坚持要遵循此步骤。
将以下脚本另存为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
现在使其可执行。
chmod +x killif.sh
现在在终端上运行此脚本。PROCID
用实际的进程ID和SIZE
以MB为单位的大小替换。
./killif.sh PROCID SIZE
例如:
./killif.sh 132451 100
如果SIZE
为100,则如果其RAM使用量超过100 MB,进程将被杀死。
警告:您知道您要做什么。杀死进程不是一个好主意。如果该进程有任何shutdown或Stop命令,则编辑脚本并kill -9
用该shutdown
命令替换命令。
这个数字太大,无法发表评论。我将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字符串和足够大的内存限制,以免不必要地杀死意外的进程。