lunes, 17 de junio de 2013

Mis Scripts Bash #1 Procesos y cerrar procesos


Script llamado killalot que dado un argumento que puede ser el nombre de un proceso (que puede estar especificado con *) o el PID o el PPID eliminará todos los procesos que cumplan estas características. Si el comando es ejecutado como root se deberá preguntar si se está seguro de la eliminación sobre los procesos de su propiedad. Si el argumento es un texto será los procesos indicados con este texto, si es un número será el proceso con ese PID y si se antepone -p serán los procesos cuyo ppid es el indicado a continuación (solo se admitirá un argumento de este tipo por vez). Si se incluye la opción -i en la lista de parámetros se preguntará siempre si se quiere eliminar el proceso o no. El comando deberá dar un mensaje breve si el proceso ha estado eliminado o no y al final un resumen de cuantos procesos eliminados y cuantos no.

Por ejemplo:
killalot fire* eliminará todos los procesos que comiencen por fire y que sean propiedad del usuario que ejecuta el shell (si lo ejecuta root podrá eliminar todos los procesos que comiencen por fire (de cualquier usuario) pero deberá preguntar por los que el propietario sea root).
killalot -i -p 1234 eliminará todos los procesos que su ppid sea 1234 y preguntará antes de su eliminación.



#!/bin/bash
# Carlos Andres Gomez Ruiz - Estudiante UOC
#GPLv3
echo "Comando para finalización de procesos"
echo
let conf=0
let pid=0
let ppid=0
let coment=0
let confroot=0
let decision=1
function confirmar {
   echo -n "Estas seguro que deseas cerrar el  proceso" $proceso "? (s/n)"
   read confirmacion

case $confirmacion in
  "s")
    decision=1
  ;;
  "n")
   decision=0
  ;;
  *)
    echo "Opcion no válida"; confirmar
  ;;
esac
}
function ident_usua {
   if [ "$usuarioproc" = "root" ] &&  [ "$confroot" -eq 0 ]
    then echo "Este es un proceso del root y no eres root, no puedes cerrarlo."; decision=0
   fi

   if [ "$usuarioproc" = "root" ] &&  [ "$confroot" -eq 1 ]
     then echo "Este proceso pertenece al root, desea eliminarlo? (s/n)";
     read confirmacion

    case $confirmacion in
       "s")
         decision=1
       ;;
       "n")
        decision=0
       ;;
       *)
         echo "Opcion no válida"; confirmar
       ;;
   esac
fi
}

echo -n "Eres el usuario " $(whoami) "y "; if [ "$(id -g)" == 0 ]; then echo -n "SI "; confroot=1; else echo -n "NO "; fi; echo "eres del grupo root."

#identifica si no hay parámetros y sale del programa
if [ "$#" == "0" ]; then echo "No hay parámetros, para ayuda: killalot -h "; exit 0; fi


####Identifica los parámetros
#Identifica si el 1er parametro es un numero o string
if [ "$1" != "-p" ] && [ "$1" != "-i" ] ; then
  if [ "$1" -eq "$1"  2>/dev/null ]
     then pid=1; proceso=$1
     else coment=1; proceso=$1
  fi
fi
#Identifica el parametro i
if [ "$1" = "-i" ]
then  conf=1
  if [ "$2" -eq "$2"  2>/dev/null ]; then  pid=1; proceso=$2
  else coment=1; proceso=$2; fi
elif  [ "$2" = "-i" ] || [ "$3" = "-i" ]
then  conf=1;
fi

#Identifica el parametro p
if [ "$1" = "-p" ]; then  ppid=1; proceso=$2;
elif [ "$2" = "-p" ]; then  ppid=1; proceso=$3;
fi

#Identifica el parametro h
if [ "$1" = "-h" ]; then
   echo "Como usar:"
   echo "killalot [NOMBRE_DEL_PROCESO] -> admite el comodin * ."
   echo "killalot [PID] -> se proporciona el PID de un proceso para finalizarlo."
   echo "killalot -p [PPID] -> si se quiere elimitar todos los procesos que dependen de un PPID."
   echo "killalot -i [PID] -> El argumento i solicitará confirmación antes de eliminar"
   echo
fi

#echo "xxxxxxxppid" $ppid "xxxxxxxxpid" $pid "xxxxxxxxxxxxcoment" $coment "xxxxxxxconf" $conf "xxxxxxxxconfroot" $confroot


##** EJECUCION DE COMANDOS


##Para PID
if [ "$pid" -eq 1 ]; then
   echo "El proceso $proceso a cerrar es "
   printf "PID \t PPID \t USUARIO \t COMENTARIO \n"
   ps -eo pid,ppid,comm,user | gawk -v VAR="$proceso" '$1==VAR {printf $1 "\t" $2 "\t" $4 "\t" $3 "\n"}'
if [ -z "$(ps -eo pid | gawk -v VAR="$proceso" '$1==VAR {print}')" ]
  then  echo "El proceso no coincide con alguno actual."; exit
fi
[ "$conf" -eq 1 ] && confirmar
#verifica que el proceso sea del mismo usuario:
usuarioproc=$(ps -eo pid,user | gawk -v VAR="$proceso" '$1==VAR {print $2}')
ident_usua
if [ "$decision" -eq 1 ]; then  kill $proceso; echo "Proceso" $proceso "eliminado"; fi

fi


##Para filtrar por comentario de un proceso
if [ "$coment" -eq 1 ]; then

   echo "El proceso a cerrar es "
if [ -z "$(ps -eo comm | gawk -v VAR="$proceso" '$1==VAR {print}')" ]
then  echo "El proceso no coincide con alguno actual."; exit
fi


for j in $(ps -eo comm,pid,ppid,user | gawk -v VAR="$proceso" '$1==VAR {print $1"_"$2 "_" $3 "_" $4}')
  do
   printf "COMENTARIO \t PID \t PPID \t USUARIO \n"
   echo $j | gawk -F_ '{printf $1 "\t" $2 "\t" $3 "\t" $4 "\n"}'
   [ "$conf" -eq 1 ] && confirmar
   proceso=$(echo $j| gawk -F_ '{print $2}')
   usuarioproc=$(echo $j| gawk -F_ '{print $4}')
   ident_usua
   if [ "$decision" -eq 1 ]; then  kill $proceso; echo "Proceso" $proceso "eliminado"; fi
done
fi

#Para procesos padres PPID y sus hijos PID
if [ "$ppid" -eq 1 ]; then
   echo "Cerrar los procesos del ppid " $proceso
if [ -z "$(ps -eo ppid | gawk -v VAR="$proceso" '$1==VAR {print}')" ]
then  echo "El proceso padre no coincide con alguno actual."; exit
fi

for j in $( ps -eo ppid,pid,comm,user | gawk -v VAR="$proceso" '$1==VAR {print $1"_"$2 "_" $3 "_" $4}')
     do
     printf "PPID \t PID \t USUARIO \t COMENTARIO \n"
     echo $j | gawk -F_ '{printf $1 "\t" $2 "\t" $4 "\t" $3 "\n"}'
     [ "$conf" -eq 1 ] && confirmar
     proceso=$(echo $j| gawk -F_ '{print $2}')
     usuarioproc=$(echo $j| gawk -F_ '{print $4}')
     ident_usua
     if [ "$decision" -eq 1 ]; then  kill $proceso; echo "Proceso" $proceso "eliminado"; fi
done
fi


[ "$coment" -eq 0 ] && [ "$ppid" -eq 0 ] && [ "$pid" -eq 0 ] && echo "No hay un parámetro válido. Para ayuda: killalot -h"



No hay comentarios:

Publicar un comentario