¿Cómo puedo monitorear el uso de CPU por usuario?


15

Necesito monitorear el uso de la CPU por parte de los usuarios de dos servidores '(Ubuntu y CentOS). Por ejemplo:

user1     5%
user2    10%
...

¿Existe alguna herramienta similar topo htopque pueda hacer eso?


¿Necesita que se muestre la parte superior en tiempo real? De lo contrario, podría considerar top -u usery redirigir el resultado a un archivo y luego monitorear a otro usuario. entonces tendría un monitor de uso de proceso para sus usuarios en un intervalo dado.
Laurent C.

Cuando dices monitor durante qué período? De vez en cuando o continuamente?
slm

Espero poder monitorear a los usuarios en tiempo real como top.
Amged Rustom

Respuestas:


17

Aquí hay un script para imprimir el uso total de la CPU para cada usuario actualmente conectado , showPerUserCPU.sh :

own=$(id -nu)
cpus=$(lscpu | grep "^CPU(s):" | awk '{print $2}')

for user in $(who | awk '{print $1}' | sort -u)
do
    # print other user's CPU usage in parallel but skip own one because
    # spawning many processes will increase our CPU usage significantly
    if [ "$user" = "$own" ]; then continue; fi
    (top -b -n 1 -u "$user" | awk -v user=$user -v CPUS=$cpus 'NR>7 { sum += $9; } END { print user, sum, sum/CPUS; }') &
    # don't spawn too many processes in parallel
    sleep 0.05
done
wait

# print own CPU usage after all spawned processes completed
top -b -n 1 -u "$own" | awk -v user=$own -v CPUS=$cpus 'NR>7 { sum += $9; } END { print user, sum, sum/CPUS; }'

Y aquí hay una versión ligeramente modificada para imprimir el uso de CPU de todos los usuarios disponibles (pero omitiendo los que tienen un uso de CPU de cero), showAllPerUserCPU.sh :

own=$(id -nu)
cpus=$(lscpu | grep "^CPU(s):" | awk '{print $2}')

for user in $(getent passwd | awk -F ":" '{print $1}' | sort -u)
do
    # print other user's CPU usage in parallel but skip own one because
    # spawning many processes will increase our CPU usage significantly
    if [ "$user" = "$own" ]; then continue; fi
    (top -b -n 1 -u "$user" | awk -v user=$user -v CPUS=$cpus 'NR>7 { sum += $9; } END { if (sum > 0.0) print user, sum, sum/CPUS; }') &
    # don't spawn too many processes in parallel
    sleep 0.05
done
wait

# print own CPU usage after all spawned processes completed
top -b -n 1 -u "$own" | awk -v user=$own -v CPUS=$cpus 'NR>7 { sum += $9; } END { print user, sum, sum/CPUS; }'

La primera columna representa el nombre de usuario, la segunda columna el uso de CPU agregado y la tercera columna el uso de CPU normalizado de acuerdo con el número de núcleos de CPU.

También hay un script relacionado para mostrar el uso total de memoria para cada usuario: showPerUserMem.sh

Para el monitoreo en vivo, simplemente ejecute estos scripts periódicamente a través del watchcomando.

Para ordenar por uso de CPU, canalice la salida a sort -k2 -nr.


1
¿Por qué está mezclando la variable bash env con la variable script? significa que $ USER ya existe, incluso todas las variables mayúsculas son env ¿no es así?
Rahul Patil

No creo que todas las variables en mayúsculas sean variables de entorno. Pero estoy de acuerdo en que sobrescribir variables ya existentes no es un estilo muy agradable.
scai

1
Generalmente es una mala idea usar MAYÚSCULAS en bash, por la razón que mencionó Rahul. Es aún peor cuando usa un nombre de variable que ya existe como un nombre ambiental (n bash, ya $USERes su nombre de usuario, por lo que es el mismo que el id -nucomando que está utilizando. He editado su publicación para cambiar esto.
terdon

El uso de variables en mayúsculas en los scripts de shell seguramente no es una mala idea, ya que nueve de cada diez scripts en mi /etc/init.d/directorio también lo están haciendo. Se debe evitar sobrescribir las variables de entorno existentes en contraste.
scai

1
He añadido una versión para incluir todos los usuarios, no sólo los que actualmente conectados.
scai
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.