我目前有一个bash脚本可以检查我的机器内存状态,并在内存超过某个阈值时向我发送电子邮件警报,我的问题是:
这是我的脚本,就像现在一样:
#!/bin/bash
############################################################
# Memory usage function #
# Captures memory usage in percentage #
# Sends an email alert if memory usage exceeds threshold #
############################################################
memory_check() {
total_ram=`cat /proc/meminfo | grep 'MemTotal' | awk '{print $2}'`;
free_ram=`cat /proc/meminfo | grep 'MemFree' | awk '{print $2}'`;
used_ram=$(($total_ram - $free_ram))
mem_percent=$(($used_ram * 100 / $total_ram))
machine_name=`hostname`
threshold=95
if [ $mem_percent -gt $threshold ]; then
echo "Memory usage has exceeded $threshold% threshold and was at $mem_percent%." > memory_alert_report
mailx -s "Memory resource alarm on $machine_name !" my@adress.com < memory_alert_report
else
exit;
fi
exit;
}
答案 0 :(得分:1)
为什么不在批处理模式下使用top? e.g
$ top -b -n 1
会将流程信息(包括内存信息)转储到标准输出。然后,您可以重定向到sort
(在相应列上排序)并为最高内存使用者提取pids。
答案 1 :(得分:1)
这不能解决您的问题,但我希望它有助于简化您的shell脚本。
从/ proc / meminfo捕获MemTotal时,原始行是:
cat /proc/meminfo | grep 'MemTotal' | awk '{print $2}'
您无需使用cat
将文件反馈到grep
。就这样做:
grep MemTotal /proc/meminfo | awk '{print $2}'
更好的是,awk隐式greplike,所以你可以用这个替换你的整个管道:
awk '/MemTotal/ {print $2}' /proc/meminfo
这意味着“如果我的行与/MemTotal/
匹配,请执行print $2
。
答案 2 :(得分:0)
正如@chepner建议的那样,我现在正在通过我的程序监视内存,这要归功于一个Java套接字,如果内存处于高电平状态,它会接收到一个信号,然后很好地关闭进程。
答案 3 :(得分:0)
即使OP找到了解决问题的更好解决方案,我也会回答原来的问题,因为我出于其他原因需要这样的脚本:
#! /usr/bin/env sh
# kills the process using the most memory
# -A: list all processes
# sort in reverse order of resident set size
pid=`ps -A --sort -rss --format pid --no-headers | head -n1`
kill $pid
sleep 15 # give it a chance to exit gracefully
kill -9 $pid # otherwise, kill forcefully
感谢Alex D为his answer on Unix Stack Exchange提供了基本的ps语法,而Jon Jensen为his article提供了让我在等待后强行杀死的想法。