PDA

Ver la Versión Completa : scrip monitorear uso CPU [SOLUCIONADO]



gechdell
30-nov-2018, 23:09
amigos que tal en esta ocasión les pido de su ayuda por que estoy da y da de vueltas y no consigo solucionarlo

tengo un script que lo unico que hace es monitorizar el uso del CPU es decir para ver que tanto se esta usando.

el script es el siguiente


#!/bin/bash

fecha=$(date +%d-%m-%Y*%T)
factor=10
base=150
#ejecuto top de manera estatica y con grep separo la lina de uso de %cpu y con AWK aislo unicamente el uso del cpu
x=$(top -b -n 1 | grep %Cpu | awk '{usage=$2} END {print usage}')
echo el porcetanje de uso del cpu es: $x % >> /home/gechdell/Documentos/scripts/log.txt

#multiplico el valor de %cpu por 10 para convertir un decimal a entero, pero aun conserva el .0
y=$(echo "$x*$factor"|bc)
echo multiplicado es $y % >> /home/gechdell/Documentos/scripts/log.txt

#quito el .0 para quedarme con un numero sin punto decimal
z=${y/.*/}
echo sin decimales es $z >> /home/gechdell/Documentos/scripts/log.txt
echo este $z es mayor que $base >> /home/gechdell/Documentos/scripts/log.txt

#comparo el uso de CPU ya convertido a entero y sin punto decimal con mi base para saber si el uso del cpu es alto o no
if [ $z -gt $base ];
then
echo el uso del cpu es alto $x % a las $fecha >> /home/gechdell/Documentos/scripts/log.txt
else
echo el uso del cpu es normal $x % a las $fecha >> /home/gechdell/Documentos/scripts/log.txt
fi


ahora si lo corro de manera manual es decir, con ./nombre este se ejecuta correctamente me crea mi archivo log.txt y me da la siguiente salida


el porcetanje de uso del cpu es: 15.7 %
multiplicado es 157.0
sin decimales es 157
este 157 es mayor que 150
el uso del cpu es alto 15.7 % a las 30-11-2018*15:23:33

ahora el detalle viene cuando agrego ese script a cron.
cron se ejecuta y lanza el script sin problema, perooooooo resulta que se pierden los valores de las variables¡¡¡¡¡¡ solo se conserva el valor de la variable x¡¡¡¡¡¡¡ y por consiguiente me arroja esto en el archivo log.txt


el porcetanje de uso del cpu es: 26,5 %
multiplicado es
sin decimales es
este es mayor que 150
el uso del cpu es normal 26,5 % a las 30-11-2018*15:24:01

por lo mismo que se pierden los valores de las variables, al momento de hacer el if, este no hace la comparación correctamente, pues no tiene los 2 valores para hacerlo.

he estado buscando mucho en internet y no encuentro nada al respecto, y mi pregunta es la misma.. por que al correrlo manual si respeta los valores de las variables, y al correcto en automatico los valores se pierden???

mi archivo contrab es el siguiente


gechdell@linux-b1aw:~/Documentos/scripts> crontab -l
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/tmp/crontab.uPEWbH installed on Fri Nov 30 15:29:57 2018)
# (Cronie version 4.2)
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin

@hourly /home/gechdell/bin/copia.sh
* * * * * /home/gechdell/Documentos/scripts/cpu.sh



ojala puedan ayudarme y orientarme con este pequeño problema.


SALUDOS
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡

DiabloRojo
01-dic-2018, 09:23
Prueba cambiar las variables x, y... por nombres como las otras. Otra posibilidad es que el comando echo deba ponerse comillas " a sus salidas

echo "el porcetanje de uso del cpu es: $x %" >> /home/gechdell/Documentos/scripts/log.txt

xisco
03-dic-2018, 09:57
Igual tiene que ver con el usuario que se lanza el script de cron, si no pones nada creo que como root, prueba con otro usuario.

Salu2

victorhck
03-dic-2018, 12:27
Hola!

Suponemos que el script tiene permisos de ejecución (chmod +x)
Yo he tenido problemas, porque al ejecutar un script en cron necesita las rutas absolutas a los archivos, pero veo que en tu caso ya está así.

Yo en cron lo tengo de esta manera:

*/5 * * * * /bin/bash /home/vhck/scripts/script.sh

pero supongo que añadiendo el path tal como lo tienes tu, serviría igual...

no se me ocurre qué podría ser...

gechdell
03-dic-2018, 20:04
Prueba cambiar las variables x, y... por nombres como las otras. Otra posibilidad es que el comando echo deba ponerse comillas " a sus salidas

echo "el porcetanje de uso del cpu es: $x %" >> /home/gechdell/Documentos/scripts/log.txt

amigo intento lo que me indicas pero aun asi no se respeta los valores de las variables
ahora tambien no solo es a la hora de imprimir en el archivo, sino que por ejemplo en el IF tampoco se respeta la condición pues las variables pierden su valor.

Lo extraño es que por que la primera variable es decir la $x si la respeta pero las siguientes nomas no


Igual tiene que ver con el usuario que se lanza el script de cron, si no pones nada creo que como root, prueba con otro usuario.

Salu2

ya lo lance como root y como usuario normal y nada hace lo mismo



Hola!

Suponemos que el script tiene permisos de ejecución (chmod +x)
Yo he tenido problemas, porque al ejecutar un script en cron necesita las rutas absolutas a los archivos, pero veo que en tu caso ya está así.

Yo en cron lo tengo de esta manera:

*/5 * * * * /bin/bash /home/vhck/scripts/script.sh

pero supongo que añadiendo el path tal como lo tienes tu, serviría igual...

no se me ocurre qué podría ser...

si el script tiene permisos de ejecucion

pero por que cuando se lanza de manera manual todo correcto, pero cuando lo hace cron nomas no funciona?????

Cuoco
03-dic-2018, 22:16
Hola estimado, la verdad que hace mucho que no hago nada de scripts, pero recuerdo que algo raro me ocurrió con un script que le asigné a cron, lo resolví leyendo el man, no quiero mentir pero creo en el mismo daba un ejemplo de que había que declarar las variables desde el script de cron, el espacio de variables del mismo no es igual que el de bash, así cuando se lanza la tarea no perdía las variables.
Saludos.

gechdell
04-dic-2018, 02:15
Hola estimado, la verdad que hace mucho que no hago nada de scripts, pero recuerdo que algo raro me ocurrió con un script que le asigné a cron, lo resolví leyendo el man, no quiero mentir pero creo en el mismo daba un ejemplo de que había que declarar las variables desde el script de cron, el espacio de variables del mismo no es igual que el de bash, así cuando se lanza la tarea no perdía las variables.
Saludos.


ya cheque el man de cron y no especifica nada sobre variables igual lo adjunto por si alguien ve algo que yo no

Defton
04-dic-2018, 04:57
no me hagas mucho caso, pero creo que te falta algo así en el script de cron:


BASH_ENV="/root/.bashrc"

segun esta paguina (https://unix.stackexchange.com/questions/67940/cron-ignores-variables-defined-in-bashrc-and-bash-profile)

aunque en el ejemplo es para el usuario root y el archivo "~/.bashrc" pero creo que en opensuse se utiliza "/etc/profile". Pero no estoy muy seguro.
Saludos.

gechdell
04-dic-2018, 18:06
no me hagas mucho caso, pero creo que te falta algo así en el script de cron:


BASH_ENV="/root/.bashrc"

segun esta paguina (https://unix.stackexchange.com/questions/67940/cron-ignores-variables-defined-in-bashrc-and-bash-profile)

aunque en el ejemplo es para el usuario root y el archivo "~/.bashrc" pero creo que en opensuse se utiliza "/etc/profile". Pero no estoy muy seguro.
Saludos.

ya lo intente pero tampoco :(

Cuoco
05-dic-2018, 03:39
Hola estimado, creo que pude replicar el problema, al intentar ejecutar tu escript en la consola me arrojaba la misma salida en el log que la que te arroja desde cron.
Ejecuté las instrucciones y variables y encontré la discrepancia en el comando bc y la salida del comando top.
En mi pc tengo todo configurado para usar español, la salida del comando top te arroja un numero decimal utilizando coma "," y el comando bc no reconoce dicho formato de números decimales, espera en su lugar un punto "."
Esto te arroja el primer error en la linea y=$(echo "$x*$factor"|bc) y eso arrastra los problemas más abajo.
La solución que se me ocurrió fue formatear la salida de la variable x y cambiar coma por punto, eso terminó el comando correctamente.
Lo que se me ocurre que puede estar pasando es una discrepancia de los locale utilizados, tu usuario tiene español y cron utiliza el de sistema (ingles), o a la inversa, eso es lo que cambia la salida del comando top para que use punto o coma, para expresar los valores decimales.
Adjunto el script modificado para que lo pruebes.

#!/bin/bash

fecha=$(date +%d-%m-%Y*%T)
factor=10
base=150
#ejecuto top de manera estatica y con grep separo la lina de uso de %cpu y con AWK aislo unicamente el uso del cpu
q=$(top -b -n 1 | grep %Cpu | awk '{usage=$2} END {print usage}')
#cambiamos la coma por el punto para que sea leido correctamente por el comando bc
x=`echo $q | sed 's/,/./g'`
echo el porcetanje de uso del cpu es: $x % >> /home/gechdell/Documentos/scripts/log.txt

#multiplico el valor de %cpu por 10 para convertir un decimal a entero, pero aun conserva el .0
y=$(echo "$x*$factor"|bc)
echo multiplicado es $y % >> /home/gechdell/Documentos/scripts/log.txt

#quito el .0 para quedarme con un numero sin punto decimal
z=${y/.*/}
echo sin decimales es $z >> /home/gechdell/Documentos/scripts/log.txt
echo este $z es mayor que $base >> /home/gechdell/Documentos/scripts/log.txt

#comparo el uso de CPU ya convertido a entero y sin punto decimal con mi base para saber si el uso del cpu es alto o no
if [ $z -gt $base ];
then
echo el uso del cpu es alto $x % a las $fecha >> /home/gechdell/Documentos/scripts/log.txt
else
echo el uso del cpu es normal $x % a las $fecha >> /home/gechdell/Documentos/scripts/log.txt
fi


Saludos.

gechdell
05-dic-2018, 17:32
Hola estimado, creo que pude replicar el problema, al intentar ejecutar tu escript en la consola me arrojaba la misma salida en el log que la que te arroja desde cron.
Ejecuté las instrucciones y variables y encontré la discrepancia en el comando bc y la salida del comando top.
En mi pc tengo todo configurado para usar español, la salida del comando top te arroja un numero decimal utilizando coma "," y el comando bc no reconoce dicho formato de números decimales, espera en su lugar un punto "."
Esto te arroja el primer error en la linea y=$(echo "$x*$factor"|bc) y eso arrastra los problemas más abajo.
La solución que se me ocurrió fue formatear la salida de la variable x y cambiar coma por punto, eso terminó el comando correctamente.
Lo que se me ocurre que puede estar pasando es una discrepancia de los locale utilizados, tu usuario tiene español y cron utiliza el de sistema (ingles), o a la inversa, eso es lo que cambia la salida del comando top para que use punto o coma, para expresar los valores decimales.
Adjunto el script modificado para que lo pruebes.

#!/bin/bash

fecha=$(date +%d-%m-%Y*%T)
factor=10
base=150
#ejecuto top de manera estatica y con grep separo la lina de uso de %cpu y con AWK aislo unicamente el uso del cpu
q=$(top -b -n 1 | grep %Cpu | awk '{usage=$2} END {print usage}')
#cambiamos la coma por el punto para que sea leido correctamente por el comando bc
x=`echo $q | sed 's/,/./g'`
echo el porcetanje de uso del cpu es: $x % >> /home/gechdell/Documentos/scripts/log.txt

#multiplico el valor de %cpu por 10 para convertir un decimal a entero, pero aun conserva el .0
y=$(echo "$x*$factor"|bc)
echo multiplicado es $y % >> /home/gechdell/Documentos/scripts/log.txt

#quito el .0 para quedarme con un numero sin punto decimal
z=${y/.*/}
echo sin decimales es $z >> /home/gechdell/Documentos/scripts/log.txt
echo este $z es mayor que $base >> /home/gechdell/Documentos/scripts/log.txt

#comparo el uso de CPU ya convertido a entero y sin punto decimal con mi base para saber si el uso del cpu es alto o no
if [ $z -gt $base ];
then
echo el uso del cpu es alto $x % a las $fecha >> /home/gechdell/Documentos/scripts/log.txt
else
echo el uso del cpu es normal $x % a las $fecha >> /home/gechdell/Documentos/scripts/log.txt
fi


Saludos.



exacto, ese era el GRAN DETALLE lo corregi y funciono al 100 muchas gracias, bien recuerdo en mis dias de estudiante como un ; hacia que todo tu codigo no compilara y ahora por no fijarme en un , me paso lo mismo


me podrian ayudar para cambiar el titulo con SOLUCIONADO