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