Comprender la gran utilidad que tiene el ciclo for pare revisiones continuas y aprender algunos comandos de unix para monitoreo.
Comandos en unix: echo, read, ps -u, grep -v, awk, ciclo for, do-done, who -R, sleep.
En unix existe el comando "who" el cual te ayuda a encontrar que usuarios se encuentran logeados en el sistema operativo.
1.-who -R | grep sybase
sybase pts/tc Mar 26 07:40 (180.50.101.21)
sybase pts/tg Mar 25 09:37 (180.50.5.109)
Como bien observas, con el comando "who -R" el sistema operativo indica cual es la ip de la pc que se encuentra logeado dentro de él.
Ahora, si verificas que proceso esta ejecutando el usuario "sybase" puedes encontrar que existe un común denominador entre el comando anterior y el nuevo ejecutado en la siguiente línea:
2.- ps -u sybase | grep -v sh | grep -v grep | grep -v ps | grep -v "?"
PID TTY TIME COMMAND
3808 pts/tg 0:00 RUN_LAB
29337 pts/tc 0:00 isql
3864 pts/tg 0:00 isql
3809 pts/tg 0:08 dataserver
El común denominador es la terminal.
Si solo quieres que te muestre las terminales de la ejecución anterior se puede anexar a la línea no.2 el comando "awk" (podría también utilizarse "cut")
3.- $ps -u sybase | grep -v sh | grep -v grep | grep -v ps | grep -v "?" | awk '{ print $2 }'
TTY
pts/tg
pts/tc
pts/tg
pts/tg
pts/th
Si no deseas que en el resultado aparezca "TTY" entonces ejecuta el comando "grep -v":
ps -u sybase | grep -v sh | grep -v grep | grep -v ps | grep -v "?" | grep -v TTY | awk '{ print $2 }'
Si ligas la línea 1 y 3 se interpreta de la siguiente forma la búsqueda que estamos realizando:
PROCESOS DE SYBASE ( ps -u sybase | grep -v sh | grep -v grep | grep -v ps | grep -v "?" | awk '{ print $2 }') QUE CORRESPONDEN A CIERTAS IPS DE PCS (who -R | grep sybase)
Shell para encontrar la pc de acuerdo a la terminal del proceso en ejecución.
Copiarlo en un archivo del sistema operativo:
Se copian las líneas a memoria de la pc, después de generar el archivo con el comando "cat > archivo" como se muestra en negritas:
SHELL A:
hp580-d:/home/asegura/PRUEBAS_SHELL> cat > uno
echo "Indica usuario a checar ...."
read usuario
ps -u $usuario | grep -v sh | grep -v grep | grep -v ps | grep -v ? | grep -v TT
Y | awk '{ print $2 }' > procesos
for a in `cat procesos`
do
ip_de_a=`who -R | grep $a | awk '{ print $6 }'`
echo "Usuario: $usuario ; Terminal $a ; Hostname: $ip_de_a "
sleep 1
done
Se adecuan los permisos al nuevo archivo:
serv_desarrollo:/home/sybase/PRUEBAS_SHELL> chmod 700 uno
Se verifican los permisos del nuevo archivo:
serv_desarrollo:/home/sybase/PRUEBAS_SHELL> ls -rlt uno
-rwx------ 1 sybase users 325 Mar 15 09:41 uno
Se ejecuta el archivo:
serv_desarrollo:/home/sybase/PRUEBAS_SHELL> uno
Indica usuario a checar ....
sybase à indicar el nombre del usuario a monitorear
Indica usuario a checar ....
sybase
La salida que te genera es:
Usuario: sybase ; Terminal pts/tg ; Hostname: (180.50.5.109)
Usuario: sybase ; Terminal pts/tc ; Hostname: (180.50.101.21)
Usuario: sybase ; Terminal pts/tg ; Hostname: (180.50.5.109)
Usuario: sybase ; Terminal pts/tg ; Hostname: (180.50.5.109)
Ahora, si deseas que te indique también el proceso que se esta ejecutando, entonces se hace lo siguiente:
SHELL B:
echo "Indica usuario:"
read usuario
ps -u $usuario | grep -v sh | grep -v grep | grep -v ps | grep -v "?" | grep -v TTY | awk '{ print $2 }' > procesos
for a in `cat procesos`
do
t=`echo $a | awk '{ print $1 }'`
p=`ps -u $usuario | grep $t | grep -v sh | grep -v grep | grep -v ps | grep -v "?" | grep -v "TTY" | awk '{ print $4 }'`
ip_de_t=`who -R | grep $t | awk '{ print $6 }'`
echo "Usuario: $usuario Terminal: $t proceso: $p hostname: $ip_de_t "
sleep 1
done
rm procesos
Salida generada después de ejecutar el shell:
Indica usuario:
sybase
Usuario: sybase Terminal: pts/tg proceso: RUN_LAB isql dataserver hostname: (180.50.5.109)
Usuario: sybase Terminal: pts/tc proceso: isql hostname: (180.50.101.21)
Usuario: sybase Terminal: pts/tg proceso: RUN_LAB isql dataserver hostname: (180.50.5.109)
Significado de las líneas programadas en el hell B:
echo "Indica usuario:"
El comando echo es para mostrar algún mensaje.
read usuario
El comando read es para guardar valores de variables
ps -u $usuario | grep -v sh | grep -v grep | grep -v ps | grep -v "?" | grep -v TTY | awk '{ print $2 }' > procesos
ps -u $usuario= verifica los procesos del usuario $usuario
$usuario= valor que se guardó en la variable usuario, para mostrar el valor una vez indicado se tiene que anteponer de la palabra usuario el signo de pesos.
grep -v palabra= indica que en la búsqueda no debe tomar en cuenta la línea que contenga la palabra "palabra".
awk= comando de unix, su uso general es para dar formato, en este caso estamos indicando que muestre el campo 2 de toda la búsqueda que se está realizando.
> procesos= ser resguarda el resultado en un archivo llamado procesos
for a in `cat procesos`
do
Se crea en for para realizar la búsqueda de lo requerido de uno por uno
t=`echo $a | awk '{ print $1 }'`
Muestra el valor de "a" primer elemento del for y después obtiene el campo 1
p=`ps -u $usuario | grep $t | grep -v sh | grep -v grep | grep -v ps | grep -v "?" | grep -v "TTY" | awk '{ print $4 }'`
ip_de_t=`who -R | grep $t | awk '{ print $6 }'`
echo "Usuario: $usuario Terminal: $t proceso: $p hostname: $ip_de_t "
sleep 1
done
Finaliza el ciclo for.
rm procesos
Espero que sea de gran utilidad la creación de este tipo de shell's para el monitoreo de usuarios que se encuentran conectados en tus aplicaciones.
Nos vemos pronto en el próximo script !!!!!