Crear Monitor de recursos linux

Iniciado por kiraastaroth, 28 Noviembre 2012, 07:31 AM

0 Miembros y 1 Visitante están viendo este tema.

kiraastaroth

Monitor de Recursos

Mediante top o ps que se vaya graficando el uso de recursos por parte de algún proceso en específico mediante variaciones con caracterés.

Desarrollar una herramienta que monitoree la información de una o varias aplicaciones en ejecución y las muestre de manera gráfica (mediante puntos, asteriscos, o el caracter de su preferencia).

El script deberá permitir especificar las aplicaciones a monitorear mediante nombre de aplicación, usuario o PID (Process ID), así como permitir indicar múltiples aplicaciones, una sola o en caso de no indicarse monitorear todas ellas.

Así mismo, se debe contar con la capacidad de indicar que parámetro se espera mostrar: CPU, memoria, tiempo, estado del proceso.

Ola a todos tengo unas dudas con este problema... espero puedan ayudarme. Especialmente en la parte de mostrar la informacion individual de una aplicacion y su informacion grafica

este es el script que asta el momento llevo hecho... simplemente pasa los resultados mostrados por el comando top y los pasa a un .txt para poder busccar una aplicacion en especifico.
Código (bash) [Seleccionar]

#!/bin/bash

echo "Ingrese el nombre de la aplicacion *Solo se repetira la accion 5 Veces*"
read nombre
echo "Espere..."
top -b -n 5 > top.txt
grep $nombre top.txt > nombre1.txt
cat nombre1.txt | cut -c 42-43 > nombre11.txt

numero=`head -n 1 nombre11.txt`
LIMITE=$numero

echo "El  Numero es  $numero "
#LIMITE=10
for ((a=1; a<= LIMITE ; a++))  # Doble paréntesis y "LIMITE" sin "$".
do
echo  -n "*" # -n = no añade salto de linea
done
echo

numero1=`tail -n 1  numero11.txt`
LIMITE1=$numero1
echo "El  Numero es  $numero "
for ((a1=1; a1<= LIMITE1 ; a1++))  # Doble paréntesis y "LIMITE" sin "$".
do
echo  -n "*" # -n = no añade salto de linea
done
echo


Espero puedan ayudarme. GRACIAS¡

-Myx-

#1
Sonaba entretenido y dado que no es mi tarea me tome la libertad de hacerlo como se me ocurrió...y hasta acá llego :D

Quizás algún día descubra un buen gráfico para la medición.

Código (bash) [Seleccionar]
#!/bin/sh
PROCESS_LIST_FILE=`mktemp`
PARSED_PROCESS_LIST_FILE=`mktemp`
GRAPH_SIZE=10

trap control_c SIGINT

control_c(){
   rm -vf $PROCESS_LIST_FILE
   rm -vf $PARSED_PROCESS_LIST_FILE
   echo 'Bye!'
   exit 5
}

f_watch_watcher(){
   while [[ -d /proc/$optionB ]]; do
       CURRENT_VALUE=`ps h -p $optionB -o $PS_STRING`
       let "CURRENT_VALUE %= $GRAPH_SIZE"
       CURRENT_VALUE=$((CURRENT_VALUE + 2))
       clear
       seq -s "+" $CURRENT_VALUE | sed 's/[0-9]//g'
       sleep 1
       clear
   done
   exit 4
}

f_get_watch(){
   select optionC in "CPU" "Memory" "CPU Time" "State"; do
       case "$optionC" in
           "CPU")PS_STRING='c';f_watch_watcher;;
           *)echo -e '501 Not implemented\nGo away! '$optionC; exit 3;;
       esac
   done
}

f_show_parsed(){
   select optionB in `cat $PARSED_PROCESS_LIST_FILE` "Done"; do
       case "$optionB" in
           "Done")exit;;
           *) f_get_watch; exit 2 ;;
       esac
   done
}

f_select_pid(){
   cat $PROCESS_LIST_FILE | cut -f1 -d' ' | tr ' ' '-' > $PARSED_PROCESS_LIST_FILE
   f_show_parsed
}

ps fh -o pid,user,comm \
     -N --ppid 2 -p 1,2 \
     | awk '$3 !~ /^[|\\]/ { print $1" "$2" "$3 }' > $PROCESS_LIST_FILE

select optionA in "PID - Process ID" "USER - User name" "COMM - Command"; do
   case "$optionA" in
       "PID - Process ID")f_select_pid;;
       *)echo -e '501 Not implemented\nGo away! '$optionA; exit 1;;
   esac
done

control_c

-Myx-

Update: ahora acepta varios PID's y tiene un poco mas de color...espero no tener que volver a hacer esto...

Código (bash) [Seleccionar]
#!/bin/sh
PROCESS_LIST_FILE=`mktemp`
PARSED_PROCESS_LIST_FILE=`mktemp`
GRAPH_SIZE=10
DOTS='****************************************************************************************************'

trap control_c SIGINT

control_c(){
    rm -f $PROCESS_LIST_FILE
    rm -f $PARSED_PROCESS_LIST_FILE
    echo 'Bye!'
    stty echo
    tput cvvis
    exit 5
}

f_watch_watcher(){
    tput clear
    tput civis
    stty -echo
    while :; do
        i=0
        for pid in $PID_LIST; do
            if [[ -d /proc/$pid ]]; then
                tput cup $i 0
                CURRENT_VALUE=`ps h -p $pid -o $PS_STRING`
                echo -n "$DOTS" "$CURRENT_VALUE"
                tput cup $i 0
                ((CURRENT_VALUE++))
                case $CURRENT_VALUE in
                    [0-9]|[1-2][0-9]|3[1-3])color='\e[0;32m';;
                    3[4-9]|[4-5][0-9]|6[0-6])color='\e[0;33m';;
                    6[7-9]|[7-9][0-9]|100)color='\e[0;31m';;
                esac
                echo -ne $color
                NOTDOT=`seq -s "+" $CURRENT_VALUE | sed 's/[0-9]//g'`
                echo -en $NOTDOT'\e[0m'
            else
                tput cup $i 0
                echo -n 'PID dead: '$pid
            fi
            ((i++))
         done
    done
    exit 4
}

f_what_watch(){
    select optionC in "CPU" "Memory" "CPU Time" "State"; do
        case "$optionC" in
            "CPU")
                PS_STRING='c'
                break
            ;;
            *)
                echo -e '501 Not implemented\nGo away!'
                exit 5
            ;;
        esac
    done
}

f_get_pidlist(){
    # TODO: Add warning if PID was selected before OR
    #       Remove PID from list
    select optionB in `cat $PARSED_PROCESS_LIST_FILE` "Done"; do
        case $optionB in
            "Done")
                # Catch empty PID_LIST
                [[ x"$PID_LIST" == 'x' ]] && echo 'You did not select any PID...' && control_c
                break # Exits select loop
            ;;
            *)
                # Catch first PID
                if [[ x"$PID_LIST" == 'x' ]]; then
                    PID_LIST=$optionB
                else
                    PID_LIST="$PID_LIST"' '"$optionB"
                fi
            ;;
        esac
    done
}

f_select_pid(){
    cat $PROCESS_LIST_FILE | cut -f1 -d' ' | tr ' ' '-' > $PARSED_PROCESS_LIST_FILE
}

f_select_filter(){
    select optionA in "PID - Process ID" "USER - User name" "COMM - Command"; do
        case $optionA in
            "PID - Process ID")
                f_select_pid # Return $PARSED_PROCESS_LIST_FILE
                break # This is for the select loop
            ;;
            "USER - User name"|"COMM - Command")
                echo -e '501 Not implemented\nGo away! '$optionA
                exit 3
            ;;
            *)
                echo 'Error!'
                exit 3
            ;;
        esac
    done
}

f_get_psfile(){
    ps h -o pid,user,comm \
      -N --ppid 2 -p 1,2 \
      | column -t | tr -s ' ' | cut -f1,2,3 -d ' '> $PROCESS_LIST_FILE
}

f_get_psfile    # Return $PROCESS_LIST_FILE
f_select_filter # Return $PARSED_PROCESS_LIST_FILE
f_get_pidlist   # Return $PID_LIST
f_what_watch    # Return $PS_STRING
f_watch_watcher # Shows nice graphs

control_c