我想要一行 shell/bash 来做一些事情:
test "`free | grep | awk | whatever` -gt 80" && any_command
Run Code Online (Sandbox Code Playgroud)
将整个系统使用的 ram的总百分比与硬编码数字(在我的情况下为 80)进行比较。test
只要any_command
在 ram 高于给定百分比时执行就无关紧要。
有关于这是如何构建 monit/bluepill/god 之类的问题的答案。我 100% 同意,您很可能应该遵循这些答案中的建议。但是,这个问题特别是关于我所描述的确切路线,无论出于何种原因,假设这可能涉及所有注意事项和问题。
怎么样:
[ $(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)
将它们结合起来留给读者作为练习。
不要重新发明轮子:)
该监控实用程序是专门设计来处理这种情况。它有据可查,并且在 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)