¿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.
¿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.
top -u user
y 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.Respuestas:
Aquí hay un script para imprimir el uso total de la CPU para cada usuario actualmente conectado , showPerUserCPU.sh :
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 :
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
watch
comando.Para ordenar por uso de CPU, canalice la salida a
sort -k2 -nr
.fuente
$USER
es su nombre de usuario, por lo que es el mismo que elid -nu
comando que está utilizando. He editado su publicación para cambiar esto./etc/init.d/
directorio también lo están haciendo. Se debe evitar sobrescribir las variables de entorno existentes en contraste.