Comprobación de porcentaje de memoria libre usando TOP y AWK -- bash campo con linux campo con awk camp codereview Relacionados El problema

Checking percentage of free memory using top and awk


5
vote

problema

Español

Se creó el siguiente código AWK para verificar si la memoria gratuita desde el comando superior es inferior al 20% del total.

Me he dado cuenta de que en realidad no necesito el 9988776665544333 , porque el 99887776655443344 99887766555443357655544335 Los parámetros están dentro del tercer awk linea.

Pero, por otro lado, no pude correr el AWK como:

   awk -v FREEM=$FREE_ME MORY -v TOTALM=$TOTAL_MEMORY '{per=int(FREEM)/int(TOTALM)*100; if(per<=20) print "FAIL" ; else print "OK"}'   

Mi código actual es:

   TOTAL_MEMORY=` top -b -n1 | grep Mem: | awk '{print $2}' `   FREE_MEMORY=` top -n1 | awk -v RS="[, ]" '/free/{print a}{a=$0}' | head -1 `    top -n1 | grep Mem | awk -v FREEM=$FREE_MEMORY -v TOTALM=$TOTAL_MEMORY '{per=int(FREEM)/int(TOTALM)*100; if(per<=20) print "FAIL" ; else print "OK"}'     

Tengo la sensación de que este código es feo debido al top -n1 | grep Mem | . ¿Hay alguna sugerencia para ejecutar el #include <iostream> #include <vector> //Calculates divisors void Divisors(unsigned number, std::vector<unsigned> &result){ for(unsigned a = 1; a < number; a++){ if(number % a == 0){ result.push_back(a); } } } //Calls for divisors and adds them unsigned SumOfDivisors(unsigned number){ unsigned result = 0; std::vector<unsigned> divisors; Divisors(number, divisors); for(unsigned a = 0; a < divisors.size(); a++){ if(divisors[a] < number) result += divisors[a]; } return result; } //Calls calculates the sum of divisors to see if it is Abundant bool IsAbundant(unsigned number){ if(SumOfDivisors(number)> number){ return true; } else{ return false; } } //pushes back abundant numbers void Abundant(unsigned limit, std::vector<unsigned> &abunNumbers){ for(unsigned a = 1; a < limit; a++){ if(IsAbundant(a)){ abunNumbers.push_back(a); } } } //Find's all number's that are the sum of two abundant numbers void SumOfAbundant(unsigned limit, std::vector<unsigned> const& abunNumbers, std::vector<bool> &sumAbun){ for(unsigned a = 0; a < abunNumbers.size(); a++){ for(unsigned b = a; b < abunNumbers.size(); b++){ if(abunNumbers[a]+abunNumbers[b] <= limit){ sumAbun[abunNumbers[a]+abunNumbers[b]] = true; } else{ break; } } } } int main(){ const unsigned limit = 28123; unsigned result = 0; std::vector<unsigned>abunNumbers; Abundant(limit, abunNumbers); std::vector<bool>sumAbun(limit,false); SumOfAbundant(limit, abunNumbers, sumAbun); for(unsigned a = 0 ; a < sumAbun.size() ; a++){ if(!sumAbun[a]){ result += a; } } std::cout << result; } 0 sin ella?

Original en ingles

The following Awk code was created in order to verify if free memory from the top command is less than 20% of the total.

I've noticed that I actually do not need the top -n1 | grep Mem |, because the FREEM and TOTALM parameters are inside the third awk line.

But on the other hand, I could not run the Awk as:

 awk -v FREEM=$FREE_ME MORY -v TOTALM=$TOTAL_MEMORY '{per=int(FREEM)/int(TOTALM)*100; if(per<=20) print "FAIL" ; else print "OK"}' 

My current code is:

 TOTAL_MEMORY=` top -b -n1 | grep Mem: | awk '{print $2}' `   FREE_MEMORY=` top -n1 | awk -v RS="[, ]" '/free/{print a}{a=$0}' | head -1 `    top -n1 | grep Mem | awk -v FREEM=$FREE_MEMORY -v TOTALM=$TOTAL_MEMORY '{per=int(FREEM)/int(TOTALM)*100; if(per<=20) print "FAIL" ; else print "OK"}'   

I have a feeling that this code is ugly because of the top -n1 | grep Mem |. Are there any suggestions on running the awk without it?

        
 
 

Lista de respuestas

5
 
vote
vote
La mejor respuesta
 

En mi sistema de prueba, la salida de top -b -n1 | head se ve así:

  top - 09:33:08 up 9 days, 23:07,  7 users,  load average: 0.01, 0.10, 0.13 Tasks: 125 total,   1 running, 124 sleeping,   0 stopped,   0 zombie Cpu(s):  0.2%us,  0.0%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st Mem:   4054892k total,  3938964k used,   115928k free,       56k buffers Swap: 10485756k total,   536176k used,  9949580k free,   438836k cached    PID USER      PR  NI  VIRT  RES  SHR S   %CPU %MEM    TIME+  COMMAND     1 root      20   0 10548   36    8 S      0  0.0   0:02.69 init     2 root      20   0     0    0    0 S      0  0.0   0:00.06 kthreadd     3 root      20   0     0    0    0 S      0  0.0   0:01.22 ksoftirqd/0   

Supongo que el tuyo es similar. A partir de su código, parece que está extrayendo los valores del if0 , En este ejemplo if1 y if2 . Esos valores se encuentran en la 2ª y 6ª columna (en términos AWK), por lo que puede obtenerlos fácilmente en un comando con:

  if3  

Ahora es fácil agregar el cálculo porcentual e imprimir el resultado:

  if4  

algunos puntos de interés adicionales:

  • Después de imprimir, nosotros if5 para dejar de procesar innecesariamente el resto de la salida provenientes de if6
  • El operador ternario if7 puede simplificar la impresión, sin necesidad de un if-Usse
  • Celebré el if8 Llamadas, como AWK parece eliminar los valores no numéricos que se arrastran de todos modos
  • El patrón if9 es más estricto que en el código original, solo para estar seguro

actualización

Si usted la posición de la memoria libre puede estar en diferentes columnas, dependiendo del sistema, tiene (al menos) 2 opciones para trabajar alrededor de eso:

  1. Si puede conocer la posición con anticipación (detectando en función del entorno del sistema / ejecución), podría pasarlo en una variable, por ejemplo:

      i0  
  2. o, puede usar expresiones regulares, por ejemplo:

      i1  
 

On my test system, the output of top -b -n1 | head looks like this:

top - 09:33:08 up 9 days, 23:07,  7 users,  load average: 0.01, 0.10, 0.13 Tasks: 125 total,   1 running, 124 sleeping,   0 stopped,   0 zombie Cpu(s):  0.2%us,  0.0%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st Mem:   4054892k total,  3938964k used,   115928k free,       56k buffers Swap: 10485756k total,   536176k used,  9949580k free,   438836k cached    PID USER      PR  NI  VIRT  RES  SHR S   %CPU %MEM    TIME+  COMMAND     1 root      20   0 10548   36    8 S      0  0.0   0:02.69 init     2 root      20   0     0    0    0 S      0  0.0   0:00.06 kthreadd     3 root      20   0     0    0    0 S      0  0.0   0:01.22 ksoftirqd/0 

I suppose yours is similar. From your code it looks like you are extracting the values from the Mem: line, in this example 4054892k and 115928k. Those values are in the 2nd and 6th column (in Awk terms), so you can get them easily in one command with:

top -b -n1 | awk '/^Mem:/ {total=int($2); free=int($6);}' 

Now it's easy to add the percentage calculation and print the result:

top -b -n1 | awk '/^Mem:/ {total = $2; free = $6; per = free / total * 100; print per <= 20 ? "FAIL" : "OK"; exit}' 

Some additional points of interest:

  • After printing, we exit to stop processing unnecessarily the rest of the output coming from top
  • The ternary operator ?: can simplify the printing, no need for an if-else
  • I dropped the int(...) calls, as Awk seems to drop the trailing non-numeric values anyway
  • The pattern /^Mem:/ is more strict than in the original code, just to be safe

UPDATE

If you the position of free memory can be in different columns depending on the system, you have (at least) 2 options to work around that:

  1. If you can know the position in advance (by detecting based on the system / runtime environment), you could pass that in as a variable, for example:

    i=6; top -b -n1 | awk -v i=$i '/^Mem:/ {total = $2; free = $i; per = free / total * 100; print per <= 20 ? "FAIL" : "OK"; exit}' 
  2. Or, you could use regular expressions, for example:

    top -b -n1 | awk '/^Mem:/ {total = $2; match($0, /[0-9]+[a-z] free/); free = substr($0, RSTART); per = free / total * 100; print per <= 20 ? "FAIL" : "OK"; exit}' 
 
 
     
     
3
 
vote

en lugar de i2 , que significamos para usarse s una pantalla interactiva, debe usar el comando 998877666554443323 , que emite las mismas dos filas de encabezados que desea .

Sin embargo, cuestionaría la motivación detrás de este código. ¿Por qué es importante verificar la cantidad de memoria libre? En cualquier sistema operativo de propósito general moderno, la memoria libre se considera la memoria desperdiciada: un recurso que podría usarse mejor para los datos del disco en caché, por ejemplo.

 

Rather than top, which us meant to be used s an interactive display, you should use the free command, which outputs the same two rows of headers that you want.

However, I would question the motivation behind this code. Why is it important to check the amount of free memory? On any modern general-purpose operating system, free memory is considered wasted memory xe2x80x94 a resource that could be better used for caching disk data, for example.

 
 

Relacionados problema

4  Extracción de entradas de campo duplicado de los datos de CSV ordenados  ( Removing duplicate field entries from sorted csv data ) 
Dada la siguiente entrada ( cat i.txt ), Quiero eliminar entradas de campo duplicadas en cada una de las tres primeras columnas y ninguna de las otras. DLO...

2  Bash Script Wallpaper Randomizer  ( Bash script wallpaper randomizer ) 
Pensé que sería divertido escribir un script simple y pequeño Bash que elige al azar un fondo de pantalla de un directorio determinado de un conjunto de imáge...

4  Script de cáscara de filtro para encontrar líneas que contienen todos los patrones especificados  ( Filter shell script to find lines that contain all specified patterns ) 
Escribí un script que hace lo siguiente: Ejecute otro script en el sistema filtra la salida para encontrar líneas que contienen todos los patrones dados ...

6  Script Shell para contar los resultados del juego de ajedrez  ( Shell script to count chess game outcomes ) 
Me encontré con este Blog Post de Adam Drake de aproximadamente un año, que ahora está haciendo las rondas otra vez . Hice algunas mejoras en su código, ...

0  Seleccione una línea específica después de hacer coincidir un patrón  ( Select a specific line after matching a pattern ) 
Recientemente comencé a usar awk y todavía estoy aprendiendo al respecto. He resuelto el problema que estoy a punto de mostrar, pero siento que no es la mejor...

4  Retire cada línea que incluya y siga la segunda ocurrencia de un patrón dado  ( Remove every line that include and follows the second occurrence of a given patt ) 
De un archivo, estoy tratando de eliminar cada línea que incluya y siga la segunda ocurrencia de un patrón dado en Bash (Mac OSX). Tenga en cuenta que un arch...

3  Script de bash para administrar notas de hashtag  ( Bash script for managing hashtag notes ) 
He escrito un script simple para administrar las notas de Hashtag. No estoy familiarizado con la scriptación de bash, así que realmente lo apreciaría si alg...

5  Lista de uso del disco del directorio  ( Directorys disk usage list ) 
Para mis clases, tuve que terminar esta tarea: Lista de uso del disco de directorio para el directorio indicado Imprime una lista de archivos y subdire...

2  Listado de imágenes Docker sin registro URI  ( Listing docker images without registry uri ) 
Tengo un registro de contenedores privados detrás de un firewall que necesitará algunas imágenes de registro de Google. Para asegurarse de que las cosas sean ...

0  Cargando un archivo en VIM a través de la salida de tubos de AG  ( Loading a file in vim via piped output of ag ) 
Me siento como si mi escenario fuera bastante simple, pero que podría sobrecomplicarlo. Estoy buscando a través de archivos en busca de una condición especi...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos