Kill masivo

Me podrías ayudar con un script para poder sacar a todos los usuarios del sistema ... Tu sabrás lo tedioso que es sacar a más de 100 usuarios para el backup diario. Gracias
Respuesta
Nunca he tenido que administrar un sistema grande y hacer copias de seguridad por lo que no entiendo muy bien porque necesitas sacar a la gente del sistema, ¿yo supongo que debe ser para no tener la CPU muy ocupada? ¿O acaso el software con que trabajas requiere alguna condición especial?... bueno, de todas formas, no se como se saca a un usuario del sistema (¿cómo lo obligas a deslogearse?) Como sea, no soy muy bueno para los scripts, prefiero hacer programas en C o java por ejemplo, que revise la lista de los usuarios del sistema, que vea si están conectados y que los desconecte (en un while), y la forma de hacerlo es ejecutando comando que den la información de esto (por ejemplo si el usuario esta conectado) haciendo un "system", así, desde u nprograma en C, se ejecutan instrucciones en el shell, tambin habrán instrucciones de PID por si los necesitas, no se, pero si eres mejor con los scripts, haz lo mismo con scripts. De todas formas... No crees que es un poco violento sacar a la fuerza a todos los usuarios del sistema obligatoriamente; si yo fuera un usuario, me cansaría del sistema, y si se que es la política del administrador, estaría echando miedas sobre el todo el día por mala política hacia los usuarios. Si no lo saben, pero aun porque van a pensar que el sistema es una mierda porque los saca y no saben porque. Yo leí que hay programas que hacen snapshots del sistema, cuentas de usuario etc... y los mismos usuarios pueden consultarlos si es que perdieron archivos, se pueden hacer múltiples snpaphots y de estos, es pueden guardar como copia de seguridad ademas de tenerlos en el sistema para poder consultar, y todo esto se hac automáticos sin tener que detener el sistema.

2 respuestas más de otros expertos

Respuesta
1
Esta tarea puede ser muy peligrosa, ya que puedes estar afectando la labor de alguien de manera importante.
Los sistemas hoy en día trabajan mucho con las Bases de Dato y otros programas cuyas salidas abruptas pueden dejar inconsistente la información y/o tareas incompletas e inclusive procesos zombies.
Te recomiendo que combines el script que te voy a dar con labores de verificación previas que garantizen que ése usuario a ser desconectado no tenga sesiones contra la Base de Datos u otro programa critico para la operación.
Este script cancela toda actividad de los usuario y debe ser corrido sólo como root, de lo contrario puedes correr el riesgo de cancelar tu propia sesión:
Script:
kill -9 $(ps -fea | grep -v "grep" | grep -v "root" | awk '{ print $2 }')
Estúdialo bien y desglozalo para que observes el porqué de cada porción de comando.
Es sencillo, puedes incluso tomar parte de este comando para utilizarlo como entrada de un ciclo FOR que te permita eliminar sesiones de sistema operativo de manera selectiva, es decir, sólo aquellas que te interesan.
Gracias por tu intención pero estimado amigo le cuento que no domino para nada la cuestión de los scripts shell, estoy seguro de la consecuencias del kill masivo, pero si usted me ayudara con un ejemplo concreto, de verdad que le estaré muy agradecido.
Intente con este ejemplo pero me da errores de grep y el kill.
who|awk '{print $1}'|uniq >/var/tmp/lista.usuarios
for i in `cat /var/tmp/lista.usuarios
|grep -v root|grep -v |awk '{FS=":";print $1}'`
do
kill -9 `ps -u $i|awk '{print $1}'`
done
** El codigo no es mio le intente por todo lado pero para mi desgracia nada.
El comando esta bien en su mayoría, los detalles están en:
1.- El ciclo FOR, el único grep que hace falta es el grep -v root, el resto no veo que haga falta ya que en el listado que se genera del Who no hay salida cuyo divisor de campo sea el carácter ":". Esta instrucción quedaría así:
for i in `cat /var/tmp/lista.usuarios | grep -v root`
Do
2.- El segundo error está en el kill que, aunque esta bien construido no te acepta el uso dinámico del comando. Esto se debe realizar de otra manera.
kill -9 $(ps -u $i | awk '{ print $1 }')
En definitiva el shell quedaria asi:
who|awk '{print $1}'|uniq >/var/tmp/lista.usuarios
for i in `cat /var/tmp/lista.usuarios
|grep -v root`
do
kill -9 $(ps -u $i|awk '{ print $1 }')
Done
OJO: Recuerda mantener el espacio en el awk que va después de '{ y antes de }' estos espacios son importantes, sino el comando no te funcionará, estas son reglas generales de programación shell.
Lo probé en este momento pero hay un problemilla, da un error en la linea 4:
syntax error at line 4: `(' unexpected
Trate de corregirlo manualmente pero sin éxito.
Esperare su respuesta, y de antemano muchas gracias.
Nelo
Entonces reestructura el SHELL así:
who|awk '{print $1}'|uniq >/var/tmp/lista.usuarios
for i in `cat /var/tmp/lista.usuarios|grep -v root`
do
for j in `ps -u $i|awk '{ print $1 }'`
do
kill -9 $j
Done
Done
Bueno te cuento que hice correr el shell
Y dio los siguientes mensajes ... pensé que eran errores ... pero al hacer un chequeo de usuarios este shell había rajado a medio mundo ... entonces mi conclusión es que funciono, de estos mensajes no se porque.
usage: kill -s signal_name pid ...
usage: kill [ -signal ] pid ...
usage: kill -l [exit_status]
kill: 5243: no such process
kill: 8558: no such process
No quiero abusar mucho de tu paciencia pero una ultima cosita más, que tendría que añadir al shell para que no mate a ciertos usuarios. Bueno sabemos del grep -v usu1, grep -v usu2 ...
Pero digamos que fueran unos 20 y los tendría almacenados en un archivo digamos: lista.nokill
Disculpas por mi insistencia y abusar de tu paciencia. Gracias.
grep -v nokill. Usuarios
Con respecto a los mensajes de los kill: ####: no such a process, esto es porque hay procesos que son hijos de otros los cuales mueren al morir su proceso padre, es por ello que al intentar matarlos el Sistema operativo ya los encuentra inexistentes y produce el error.
Si tu lo que deseas es ir excluyendo usuarios que no te interesa matar, debes hacerlo con la instrucción grep -v, pero debes hacerlo en cadena, es decir, debes ir filtrando las salidas del comando hasta que queden los que realmente te interesan eliminar.
Ejemplo:
Quiero cancelar a todos los usuarios excepto a: ana, pedro y juan; entonces el comando seria algo como esto:
who|grep -v "ana" | grep -v "pedro" | grep -v "juan" | awk '{print $1}'|uniq >/var/tmp/lista.usuarios
Esto te ayudará a crear una lista de usuarios que sea limpia, es decir, con sólo aquellos que efectivamente vas a cancelar.
Respuesta
A mi se me ocurre ponerte en single user.
# init 1
Si eso lanza antes un mensaje a todos tus usuarios con wall para avisarles y listo.
De estos 100 unos 5 deben quedar habilitados para el cierre de sus respectivas cajas u otros enseres del sistema dbms, habría alguna forma de utilizar el init especificando usuarios.
Otra cosa, usar wall con estos cristianos es como hablar a la pared, el método "sociable" no funciona con estos cristianos.
Gracias.
Antes de nada decirte que soy cristiano ;-)
No existe ningún modo de especificar los usuarios en Init. Si haces un script que mate usuarios estos volverán a entrar de nuevo y no conseguiremos mucho.
A mi se me ocurre bloquear las cuentas, echar a los que no deban estar. Realizar el backup y finalmente reactivar las cuentas.
Un consejo es que en el mensaje de bienvenida indiques que la cuenta esta desactivada temporalmente debido a backup, quizás así evites que tus "cristianos" se pregunten que pasa en el sistema.
Si no sabes hacer algo puedes utilizar el método sociable con esta pared, pared cristiana.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas