如何在Shell脚本中优雅地处理内存不足

时间:2019-06-26 10:29:07

标签: bash shell out-of-memory

是否有办法在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中适当地处理内存不足的情况?怎么样?

是否可以释放临时缓冲区并尝试继续执行,还是可以执行一些自定义错误处理(保存状态)并退出并出现错误?

2 个答案:

答案 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