memtop

Nombre: memtop
Autor: Point_to_null (Carlos Marcelo Cabrera)
Origen: Propio
Lenguaje: python
Dependencias: ninguna
Licencia: GPL
Propósito: Muestra información de los procesos que más memoria ocupan

Código:

#!/usr/bin/env python
#-*- coding: UTF-8 -*-
import commands
import operator
import shutil
import curses
import time
import sys

PAUSE = 15

def get_pids():
    return [int(i) for i in shutil.os.listdir("/proc") if i.isdigit()]

def get_mem(pid):
    try:
        file = open("/proc/%d/statm" % pid)
        memory = file.read().split()[0]
        file.close()
        return int(memory)
    except:
        return 0

def get_name(pid):
    try:
        file = open("/proc/%d/stat" % pid)
        name = file.read().split("(")[1].split(")")[0]
        file.close()
        return name
    except:
        return None

def main():
    if len(sys.argv) > 1:
        repeat = int(sys.argv[1])
    else:
        repeat = -1

    step = 0
    window = curses.initscr()
    while step != repeat:
        pids = [(get_mem(pid), pid, get_name(pid)) for pid in get_pids()]

        # Groups
        pidsdict = {}
        for pid in pids:
            if pid[2] in pidsdict:
                pidsdict[pid[2]][0] += pid[0]
                pidsdict[pid[2]][1] = "group"
            else:
                pidsdict[pid[2]] = list((pid[0], pid[1]))

        pids = [(pid[1][0], pid[1][1], pid[0]) for pid in pidsdict.iteritems()]

        pids.sort(key=operator.itemgetter(0), reverse=True)

        pos = 0
        window.clear()
        for pid in pids[:window.getmaxyx()[0]]:
            window.addstr(pos, 1, "%8.2f MB %5s %s" % (pid[0]/1024., pid[1], pid[2]), )
            pos += 1
        window.refresh()
        step += 1

        time.sleep(PAUSE)
   

if __name__ == "__main__":
    exit(main())

Ejemplos de uso:
memtop [numero]

Acepta un único parámetro opcional que especifica la cantidad de veces que se mostrará la pantalla. Si es igual a 1 se mostrará una sola vez y finalizara el programa sin esperar el tiempo de refresco. Si no se especifica memtop mostrará la pantalla hasta ser finalizado.

Changelog:

  • Versión 2
    • Es una reescritura completa del programa en python.

    • Agregada la agrupación por nombres. Es la única al momento y por defecto.
    • Movido a curses para asegurar portabilidad
  • Versión 1
    • Versión inicial. Escrita en awk. Depende de ps y el algoritmo de calculo de memoria ocupada no es realmente confiable.