Ordenar usuarios en Bash [Solucionado]

Iniciado por Flakito81, 5 Abril 2010, 02:37 AM

0 Miembros y 1 Visitante están viendo este tema.

Flakito81

Hola gente!!

Mi pregunta es simple, pero que soy incapaz de dar con la solución:

¿Cómo puedo ordenar los usuarios logeados por los procesos que tiene abierto?

Hasta ahora para conseguir los usuarios hago algo tal que:
Código (bash) [Seleccionar]

who | cut -d ' ' -f1 | sort -u

Guardo la salida en un array y con un for lanzo un ps -Af (seleccionado las columnas que me interesan) le pongo el grep $i y finalmente hago otro ps similar al anterior y cuento las lineas (wc -l) para saber el numero de procesos.
La salida me viene quedando:
USER  STIME PROCESOS

(Donde el usuario solo se muestra una vez (uso el head para ello))

El tema es que no puedo ordenar esas filas por numero de procesos porque pertenecen a dos comandos diferentes y no lo puedo hacer en uno (al menos no se como) xq si uso el wc -l solo me va a sacar el numero de procesos y ninguna otra informacion.
La unica solucion que se me ocurre es que los usuarios ya esten ordenados en el array por el numero de procesos, pero no sé como.

Espero que me podais ayudar!!

Gracias!

leogtz

#1
Hola, Flakito81, no te he entendido muy bien, pero bueno, veamos.

El comando:
Código (bash) [Seleccionar]
ps -u USUARIO

Te podría facilitar las cosas, ahora, si lo trabajas con "wc" o "awk":

Código (bash) [Seleccionar]
leo@lein:~/Escritorio$ ps -u leo | wc -l
54
leo@lein:~/Escritorio$ ps -u root | wc -l
64
leo@lein:~/Escritorio$


Yo en mi caso no te puedo ayudar mucho porque solo tengo un usuario en mi máquina:

Código (bash) [Seleccionar]
leo@lein:~/Escritorio$ who | awk '{print$1}' | uniq | wc -l
1
leo@lein:~/Escritorio$


O incluso podrías usar esto:

Código (bash) [Seleccionar]
leo@lein:~/Escritorio$ ps aux -u leo | grep -ci "leo"
53
leo@lein:~/Escritorio$ ps aux -u root | grep -ci "root"
66
leo@lein:~/Escritorio$


Usando -c para las ocurrencias.

O incluso podrías hacer esto (no probado con más de 1 usuario):

Código (bash) [Seleccionar]
for usuario in $(who | awk '{print $1}' | uniq); do echo -e "$usuario : `ps -u $usuario | wc -l`"; done

Código (bash) [Seleccionar]

for usuario in $(who | awk '{print $1}' | uniq); do echo -e "$usuario : `ps -u $usuario | wc -l`"; done | sort


Solo tengo un usuario en mi máquina, así que no puedo ayudarte mucho, pero publica tus avances y el código para ver que se puede hacer.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

Flakito81

Para empezar te quiero dar las gracias Leo no sólo por responder sino porque me ayudaste bastante.

Recien estoy comenzando a hacer scripts en bash muy simples y no domino todos los comandos, de hecho el awk lo había visto escrito por ahí  pero no sabía para que era.

En cuanto a que no entendias no me extraña porque leyendo ahora mi propio post me cuesta entenderme a mi mismo xDD. Pero te explico lo que quería hacer, e hice:
La idea era crear un script que listara el numero de procesos de cada usuario (conectados a un servidor), junto con su login y con stime mas antiguo de sus procesos (todo ello ordenado en orden descendente por numero de procesos) . Opcionalmente quería ponerle dos opciones tan sencillas como inutiles:
1- informar al usuario que ha superado el número de procesos asignados
2- matarle procesos hasta que esté dentro del limite

Obviamente sé que lo segundo es inviable porque se pueden matar procesos importantes. Y lo primero un poco también porque si tiene desactivado los mensajes el write no funciona.


Ese era todo mi problema, el script lo tengo hecho y lo postearé el viernes probablemente.

Lo dicho muchisimas gracias por la ayuda.

PD: Ya se que existe el comando ulimit