当内存使用量超出特定限制时,如何自动终止进程?

当内存使用量超出特定限制时,如何自动终止进程?

有时当我运行 skype 时,它​​会占用大量内存,事实上
我无法关闭它,一切都像疯了一样滞后。但这只是有时
有命令可以跟踪 skype,当它占用大量内存时,就关闭它。就像这样

track skype when memory exceeds XXXX killall skype

答案1

虽然主动设定限制可能是有意义的,但让我们回答 OP 的问题 :-)

在 中编写一个 Upstart 脚本/etc/init/skype-killer.confskype如果不是skype,则将其替换为 Skype 的二进制名称,并将500000(例如 500000 kB = 500 M) 替换为您希望强制执行的 Skype 虚拟内存大小限制 (以 kB 为单位) 以及30检查间隔的秒数。

此作业将在启动时启动并持续检查 skype 内存使用情况。将其复制到 后/etc/initsudo请执行sudo start skype-killer以使其运行,或重新启动系统。如果您希望修改内存使用情况,请编辑skype-killer.conf并执行sudo stop skype-killer; sudo start skype-killer

start on startup
stop on shutdown

script
  while /bin/true; do
    if $(pidof skype); then
      test $(cat /proc/`pidof skype`/status | grep "VmSize:" | sed -re s,VmSize:\\s+,, | cut -d" " -f1) -gt 500000 && killall skype
    fi
    sleep 30
  done
end script

答案2

最简单的方法是使用 bashulimit命令,该命令告诉内核在内存使用量超过特定限制时自动终止 shell(以及其所有子进程)。

  • 使用以下命令启动终端Ctrl-Alt-T
  • 输入ulimit -v N以设置限制以千字节为单位例如256000256 MB。
  • 使用以下设备启动 Skypeskype

如果 Skype 超出了您通过 设定的限制,内核将自动终止 Skype N。您可能需要多次尝试不同的N值来设定一个合适的阈值,以使 Skype 在开始影响您的系统(“挂起”)之前被终止,而不是在正常运行期间被终止。

答案3

Tuminoid 的代码对我来说不起作用。我按照以下方式对其进行了修改。此外,我还降低了内存阈值和休眠时间。

start on startup
stop on shutdown

script
   while /bin/true; do
       if (pidof skype) 
     then
          test $(cat /proc/`pidof skype`/status | grep "VmSize:" | sed -re s,VmSize:\\s+,, | cut -d" " -f1) -gt 500000 && killall skype
       fi
       sleep 10
  done
end script

相关内容