用于检查和响应内存使用情况的一行脚本

Max*_*yak 3 ubuntu shell bash

我想要一行 shell/bash 来做一些事情:

test "`free | grep | awk | whatever` -gt 80" && any_command
Run Code Online (Sandbox Code Playgroud)

将整个系统使用的 ram总百分比与硬编码数字(在我的情况下为 80)进行比较。test只要any_command在 ram 高于给定百分比时执行就无关紧要。

  • 确切的字节/兆字节而不是百分比是可以的
  • 这应该适用于典型的 ubuntu 14.04
  • 用作 cron 作业
  • 奖励:做同样事情的单线,但检查特定过程的 ram

更新

有关于这是如何构建 monit/bluepill/god 之类的问题的答案。我 100% 同意,您很可能应该遵循这些答案中的建议。但是,这个问题特别是关于我所描述的确切路线,无论出于何种原因,假设这可能涉及所有注意事项和问题。

aif*_*aif 5

怎么样:

[ $(free -m| grep  Mem | awk '{ print int($3/$2*100) }') -gt "80" ] && echo "greater " || echo "lesser"
Run Code Online (Sandbox Code Playgroud)

对于流程消耗,这是解决方案的一个可能部分:

for p in $(pgrep bash); do total=$(($total + $(awk '/VmSize/ { print $2 }' /proc/$p/status))); done ; echo "Total memory usage: $total kb" ; unset total
Run Code Online (Sandbox Code Playgroud)

将它们结合起来留给读者作为练习。


eww*_*ite 5

不要重新发明轮子:)

监控实用程序是专门设计来处理这种情况。它有据可查,并且在 ServerFault 上有很多示例

  check system kale.GreenLeaf.com
    if loadavg (5min) > 16 for 15 cycles then alert
    if memory usage > 92% then alert
    if swap usage > 10% then alert
Run Code Online (Sandbox Code Playgroud)

或者对于一个过程:

check process cups
    with pidfile "/var/run/cupsd.pid"
    start program = "/sbin/service cups start"
    stop program = "/sbin/service cups stop"
    if 10 restarts within 11 cycles then timeout
    if total memory > 1000.0 MB for 5 cycles then alert
    if total memory > 2000.0 MB for 5 cycles then restart
    if cpu usage > 95% for 11 cycles then restart
Run Code Online (Sandbox Code Playgroud)

您可以配置 EXEC,而不是警报或启动/停止/重启操作:

EXEC 可用于执行任意程序并发送警报。如果选择此操作,则必须说明要执行的程序,如果程序需要参数,则必须将程序及其参数括在带引号的字符串中。您可以选择指定执行的程序在启动时应切换到的 uid 和 gid ...

if total memory > 2000.0 MB for 5 cycles then exec "/sbin/service sidekiq restart"
Run Code Online (Sandbox Code Playgroud)