Advertisement
angeldp

ejerProcesos.sh

May 9th, 2011
218
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 6.97 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. ############################################################################
  4. #    Script para control de procesos.
  5. #
  6. # El script solicitará un nombre de proceso y mostrará cuatro posibles
  7. # opciones: Ver información del proceso; editar su prioridad; detenerlo
  8. # o relanzarlo; y finalizar su ejecución.
  9. #
  10. # Autor: angeldp
  11. #
  12. ############################################################################
  13.  
  14. clear
  15. # Las variables CTR y OPC las usaré para salir de los bucles.
  16. CTR=0
  17. OPC=0
  18. # Pediré que introduzca el nombre de un proceso hasta que se indique
  19. # uno que exista y que sólo haya un con ese nombre. Para ayudar,
  20. # muestro la lista de procesos en ejecución propiedad del usuario
  21. # que ejecuta el script (LPROCESOS)
  22. LPROCESOS=`ps ux | grep ^$USER | tr -s ' ' | cut -d " " -f11 | grep -v ^/`
  23. until [ $CTR -eq 1 ]
  24.    do
  25.    clear
  26.    echo "Indique un proceso de los siguientes:"
  27.    echo "$LPROCESOS"
  28.    read PROCESO
  29.    CTR=`ps ux | grep ^$USER | tr -s ' ' | cut -d " " -f11 | grep $PROCESO | wc -l`
  30. #  Si no se encuentra ningún proceso lo indico antes de pedirlo de nuevo.
  31.    if  [ $CTR -eq 0 ]
  32.       then
  33.       echo "No se ha encontrado ningún proceso de $USER llamado $PROCESO"
  34.       echo "Pulse cualquier tecla para volver a intentarlo."
  35.       read -n1 -s NADA
  36. #  si hay más de un proceso con ese nombre, muestro un mensaje advirtiéndolo.
  37.    elif [ $CTR -gt 1 ]
  38.       then
  39.       echo "Se ha encontrado más de un proceso de $USER llamado $PROCESO"
  40.       echo "Pulse cualquier tecla para volver a intentarlo."
  41.       read -n1 -s NADA
  42.    fi
  43. done
  44. # Fin de until [ $CTR -eq 1 ]
  45.  
  46. # Por medio de este bucle mostraré un menú hasta que no se pulse
  47. # la opción de salida del script ( x mayúscula o minúscula. )
  48. until [ "$OPC" = "x" -o "$OPC" = "X" ]
  49.    do
  50. #  Dado que voy a necesitar en varias ocasiones valores como el PID, el estado,
  51. #  la prioridad, etc. Almaceno esos valores en unas variables antes de mostrar el menú:
  52.    NEWPRI=100
  53.    NUMPID=`ps ux | grep ^$USER | tr -s ' ' | cut -d " " -f1-11 | grep $PROCESO | cut -d " " -f2`
  54.    NUMCPU=`ps ux | grep ^$USER | tr -s ' ' | cut -d " " -f1-11 | grep $PROCESO | cut -d " " -f3`
  55.    NUMMEM=`ps ux | grep ^$USER | tr -s ' ' | cut -d " " -f1-11 | grep $PROCESO | cut -d " " -f4`
  56.    PRIOR=`ps lx | tr -s ' ' | cut -d " " -f1-13 | grep $PROCESO | cut -d" " -f6`
  57.    STADO=`ps ux | grep ^$USER | tr -s ' ' | cut -d " " -f1-11 | grep $PROCESO | cut -d " " -f8`
  58. #  Dependiendo del primer caracter del campo estado, actualizo
  59. #  la variable ESTADO a su correspondencia legible
  60.    case $STADO in
  61.       D* )ESTADO="bloqueado";;
  62.       R* )ESTADO="ejecutándose";;
  63.       S* )ESTADO="dormido";;
  64.       T* )ESTADO="detenido";;
  65.       Z* )ESTADO="zombie";;
  66.       * ) ESTADO="desconocido";;
  67.    esac    
  68.    clear
  69.    echo "M ---> Muestra información detallada del proceso $PROCESO"
  70.    echo "C ---> Permite modificar la prioridad de $PROCESO"
  71.    echo "D ---> Se emplea para detener o relanzar el proceso"
  72.    echo "K ---> Intentará finalizar la ejecución del proceso $PROCESO"
  73.    echo "X ---> Salir"
  74. #  Leo un solo caracter (-n 1) en OPC e impido que se muestre (-s)
  75.    read -n1 -s OPC
  76. #  Dependiendo del carácter almacenado en OPC...
  77.    case $OPC in
  78. #     Si se pulsó una "M" mayúscula o minúscula muestro la información
  79.       "m"|"M" )
  80.       clear
  81.       echo "El PID del proceso $PROCESO es $NUMPID."
  82.       echo "Su porcentaje de uso de procesador: $NUMCPU%"
  83.       echo "Su porcentaje de uso de memoria es: $NUMMEM%"
  84.       echo "Se está ejecutando con prioridad $PRIOR"
  85.       echo "$PROCESO se encuentra en estado $ESTADO"
  86.       echo ""
  87.       echo "Pulse cualquier tecla para volver al menú. "  
  88.       read -n1 -s NADA;;
  89. #     Si se pulsó C modifico la prioridad
  90.       "c"|"C" )
  91.       clear
  92. #     Si el usuario es root, permito valores entre 19 y -20
  93.       if [ "$USER" = "root" ]
  94.          then  
  95.          until [ $NEWPRI -le 19 -a $NEWPRI -ge -20 ]
  96.             do
  97.             clear  
  98.             echo "La prioridad actual de $PROCESO es $PRIOR,"
  99.             echo -n "indique una nueva entre 19 (menor) y -20 (mayor): "
  100.             read NEWPRI
  101.          done
  102.       else
  103. #     si no es root, los valores permitidos están entre 0 y 19
  104.          until [ $NEWPRI -le 19 -a $NEWPRI -ge 0 ]
  105.             do  
  106.             clear
  107.             echo "La prioridad es $PRIOR, indique una nueva entre 0 (mayor) y 19 (menor)"
  108.             read NEWPRI
  109.          done
  110.       fi
  111. #     Con la prioridad en el rango permitido, la cambio:
  112.       renice -n $NEWPRI -p $NUMPID > /dev/null 2>&1
  113.       echo "La nueva prioridad es: `ps lx | tr -s ' ' | cut -d " " -f1-13 | grep $PROCESO | cut -d" " -f6`"
  114.       echo "Pulse cualquier tecla para volver al menú. "      
  115.       read -n1 -s NADA;;
  116. #     Si se pulsó K se finalizará el proceso
  117.       "k"|"K" )
  118.       clear
  119.       echo "Intentando acabar con $PROCESO"
  120. #     Primero se intenta por las buenas enviando SIGTERM
  121.       kill -15 $NUMPID >/dev/null 2>&1
  122. #     si el proceso continua en ejecución se envía SIGKILL
  123.       if [ `ps ux | grep ^$USER | tr -s ' ' | cut -d " " -f11 | grep $PROCESO | wc -l` -ne 0 ]
  124.          then
  125.          kill -9 $NUMPID >/dev/null 2>&1
  126. #        si aún está ejecutándose (cosa poco probable) se advierte.
  127.          if [ `ps ux | grep ^$USER | tr -s ' ' | cut -d " " -f11 | grep $PROCESO | wc -l` -ne 0 ]
  128.             then
  129.             echo "Ha sido imposible acabar con $PROCESO, "
  130.             echo "inténtelo de nuevo más tarde. "
  131.          else
  132.             echo "El proceso ha sido eliminado."
  133. #           Coloco la opción x en OPC para salir del menú
  134. #           ya que no existe más el proceso
  135.             OPC="x"
  136.          fi
  137.       else
  138.          echo "El proceso ha finalizado"
  139. #        Y pongo X en OPC para que no vuelva a salir el menú
  140.          OPC="x"
  141.       fi
  142.       echo "Pulse cualquier tecla para finalizar. "  
  143.       read -n1 -s NADA;;
  144. #     Si la opción ha sido la D habrá que detener el
  145. #     proceso (si está ejecutándose) o relanzarlo
  146. #     si está detenido. En otro caso no se hará nada.
  147.       "d"|"D" )
  148.       clear
  149.       echo "El proceso $PROCESO se encuentra $ESTADO"
  150.       if [ "$ESTADO" = "ejecutándose" -o "$ESTADO" = "dormido" ]
  151.          then
  152.          echo "Deteniendo $PROCESO"
  153.          kill -s SIGSTOP $NUMPID > /dev/null 2>&1
  154.       elif [ "$ESTADO" = "detenido" ]
  155.          then
  156.          echo "Relanzando $PROCESO"
  157.          kill -s SIGCONT $NUMPID > /dev/null 2>&1
  158.       else
  159.          echo "No se hará nada"
  160.       fi
  161.       echo "Pulse cualquier tecla para volver al menú. "  
  162.       read -n1 -s NADA;;      
  163. #     Si la opción pulsada es la x limpio la pantalla y finaliza el script
  164.       "x"|"X" )clear;;
  165. #     Si ha pulsado cualquier otra cosa hay que advertir del error.
  166.       * )
  167.       clear
  168.       echo "Opción inválida: $OPC"
  169.       echo "Pulse cualquier tecla para regresar al menú."
  170.       read -n1 -s NADA;;
  171.    esac
  172. #  Fin del menú
  173.  
  174. done
  175. # Fin del bucle until [ "$OPC" = "x" -o "$OPC" = "X" ]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement