Cómo obtener información general sobre la CPU (por ejemplo, 57%) en Linux

Me pregunto cómo puede obtener el uso de la CPU del sistema y presentarlo en porcentaje utilizando bash, por ejemplo.

Muestra de salida:

57% 

En caso de que haya más de un núcleo, sería bueno que se pudiera calcular un porcentaje promedio.

Eche un vistazo a cat /proc/stat

grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage "%"}'

EDIT por favor lea los comentarios antes de copiar y pegar esto o usar esto para cualquier trabajo serio. Esto no fue probado ni usado, es una idea para las personas que no desean instalar una utilidad o para algo que funciona en cualquier distribución. Algunas personas piensan que se puede “obtener-instalar” cualquier cosa.

Puedes probar:

 top -bn1 | grep "Cpu(s)" | \ sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | \ awk '{print 100 - $1"%"}' 

Pruebe mpstat desde el paquete sysstat

 > sudo apt-get install sysstat Linux 3.0.0-13-generic (ws025) 02/10/2012 _x86_64_ (2 CPU) 03:33:26 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 03:33:26 PM all 2.39 0.04 0.19 0.34 0.00 0.01 0.00 0.00 97.03 

Luego, algunos cut o grep para analizar la información que necesita:

 mpstat | grep -A 5 "%idle" | tail -n 1 | awk -F " " '{print 100 - $ 12}'a 

Bien podría arrojar una respuesta real con mi solución, que fue inspirada por Peter Liljenberg:

 $ mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12"%" }' 0.75% 

Esto usará awk para imprimir 100 menos el campo 12 (inactivo), con un signo de porcentaje después de él. awk solo hará esto para una línea donde el 12º campo solo tiene números y puntos ( $12 ~ /[0-9]+/ ).

EDITADO: noté que en la respuesta de otro usuario,% inactivo era el campo 12 en lugar del campo 11. El awk se ha actualizado para dar cuenta de que el campo% inactivo es variable.

Esto debería obtener el resultado deseado:

 mpstat | awk '$3 ~ /CPU/ { for(i=1;i< =NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { print 100 - $field }' 

Si desea un redondeo de entero simple, puede usar printf:

 mpstat | awk '$3 ~ /CPU/ { for(i=1;i< =NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { printf("%d%%",100 - $field) }'