找出哪些进程使用最多的内存并杀死它们

时间:2014-12-11 16:30:05

标签: bash unix memory-management

我目前有一个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;
}

4 个答案:

答案 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提供了让我在等待后强行杀死的想法。