-5
#! /bin/bash
#
# clear_ram.sh - Clear as much user-space ram as possible 
#                       (until the OOM_killer gets us)
#

       swapoff -a
       mem=$(free -b | grep Mem | awk '{print $2}')
       mount none -t tmpfs -o size=$mem /tmp
       dd if=/dev/zero of=/tmp/zero.dat bs=1M &
       echo "17" > /proc/$(pidof dd)/oomadj
       while (pidof dd); do kill -USR1 $(pidof dd); done

这是一个外壳脚本。这段代码有什么作用?

不是家庭作业

4

1 回答 1

3

这个脚本

  • 停用交换
  • 获得以字节为单位的 RAM 量
  • 挂载一个等于可用 RAM 的 ramdisk
  • 通过 dd 将零写入 ramdisk
  • 尝试将dd进程设置为内存不足杀手的第一块
  • dd只要它继续运行,就打印它的进程 ID及其当前状态

我说“尝试”是因为它应该写入oom_adj而不是写入oomadj,至少对于最近的内核来说,并且因为最大值是 15 而不是 17。

这里还有一个错误,因为它会打印所有正在执行的 PID 和状态dd,而不仅仅是脚本中的那个。

正如评论所说,最终内核内存不足杀手将终止该进程。

我很确定这是一件愚蠢的事情。我不知道为什么您实际上需要以这种方式将内存归零。

于 2012-06-22T18:42:52.783 回答