是否有办法在Shell脚本中正常处理内存不足的情况?
$ cat test.sh
#!/bin/sh
i=asdf
while true; do
i="$i $i"
done
$ bash test.sh
test.sh: xrealloc: cannot allocate 18446744072098939008 bytes
许多编程语言都允许使用简单的try-catch构造来处理内存不足异常。是否有可能在shell脚本/ Bash中适当地处理内存不足的情况?怎么样?
是否可以释放临时缓冲区并尝试继续执行,还是可以执行一些自定义错误处理(保存状态)并退出并出现错误?
答案 0 :(得分:1)
没有什么比尝试/捕获Bash的内存异常优雅的了。
但是您可以选择自己监视内存消耗。
http://man7.org/linux/man-pages/man5/proc.5.html
最简单的方法是像这样监视内核的OOM(内存不足)分数:
cat /proc/$$/oom_score
在此处查看有关OOM分数的更多信息: https://serverfault.com/a/571326/177301
OOM分数大约是十倍百分比。
使用您的示例,它将像这样工作:
#!/bin/sh
i=asdf
while true; do
i="$i $i"
if [ $(cat /proc/$$/oom_score) -gt 200 ]
then
echo "Abort: OOM score over 200" 1>&2
exit 1
fi
done
我做了一点实验。在我的Ubuntu VM上,OOM分数达到241之后,内核会立即杀死脚本。您的工作量可能会有所不同。
答案 1 :(得分:0)
不是我所知道的。相反,当您遇到这样的问题时,通常的方法是通过ulimit
提高限制。
ulimit -m N # for the heap
ulimit -s N # for the stack
但是,要以编程方式检测到它,您必须执行与strace
类似的功能并注意ENOMEM
。