Usar el comando awk o cut para obtener el porcentaje de CPU

0

Estoy tratando de ejecutar un comando de Linux a través de un script PHP para obtener el porcentaje de CPU para cada núcleo:

... con cut:

 $output = null;
 passthru("mpstat -P ALL | grep 0 | tr -s ' ' | cut -d ' ' -f 4", $output);
 echo "$output <br>";

... con awk:

$output = null;
passthru("mpstat -P ALL | grep 0 | tr -s ' ' | awk '{print $4}'", $output);
echo "$output <br>";

con las dos declaraciones el resultado es:

el nombre de mi servidor 2.19 2.21 2.30 2.26 2.22 2.20 2.14 2.09 2.07 0

Mi servidor tiene una CPU de 8 núcleos y quiero usar la salida directamente en los gráficos de Google, por lo que necesito solo el porcentaje de CPU para 8 núcleos, sin el nombre del servidor.

¿Me puede ayudar con este problema?

Mohammed AL Jakry
fuente
Entonces, ¿cuál es tu problema? ¿Usando echo(implode("\n", $output)[1]);hace lo que necesitas?
Salem
gracias, pero aún me da (el nombre del servidor) antes de los números
Mohammed AL Jakry
Si el nombre del servidor siempre tiene la misma longitud, puede usar 'cortar' para eliminar la primera parte.
Hennes
gracias pero el nombre del servidor no siempre es el mismo, ¿quiero obtener solo los números awko el cutcomando?
Mohammed AL Jakry
1
@MohammedALJakry ¿Puedes usar algún servicio de pegado para proporcionar la salida de mpstat -P ALL? Ejecutando exactamente los mismos comandos que usted, no obtengo mi nombre de host en la salida. Obtuve lo siguiente (4 núcleos): `23/05/2013% usr 6.71 8.05 7.45 5.87 5.48`.
Salem

Respuestas:

1

Estoy haciendo eco de la cadena porque mi sistema mpstates diferente de lo que muestra en su pregunta, pero debería funcionar si su salida es lo que ha publicado.

<?
$string="the name of my server 2.19 2.21 2.30 2.26 2.22 2.20 2.14 2.09 2.07 0";
$output=system("echo $string | perl -ne '/^.+?\s+([\d\. ]+)/; print \"$1\"'");
echo "$output <br>";
?>

El script de Perl solo busca el tramo más largo de dígitos, puntos decimales y espacios ( [\d\. ]+) y lo imprime, que debería separar los nombres del servidor de los datos con nombres arbitrarios del servidor. Fallará si el nombre de su servidor termina con un número, algo así foo bar 12. No se tratará 12como parte del nombre del servidor, sino como parte de los datos.

Si los nombres de su servidor nunca contienen espacios (lo cual supongo que no contienen), puede usar esta gawkversión si lo prefiere:

<?
$string="thenameofmyserver 2.19 2.21 2.30 2.26 2.22 2.20 2.14 2.09 2.07 0";
$output=system("echo $string | gawk '{for(i=2; i<=NF; i++){printf \"%s \",$(i)}}'");
echo "$output <br>";
?>
terdon
fuente